首页 新闻 会员 周边 捐助

关于wpf的DataGrid控件,隐藏列

0
悬赏园豆:15 [已解决问题] 解决于 2012-01-12 15:14

最近在研究wpf的DataGrid绑定DataTabel,绑定之后没有问题,但是我想隐藏某一列,在绑定之后设置这一列的Visibility属性为Collapsed或者为Hidden,都不能马上将这个列隐藏。
具体代码为:
dataGrid1.ItemsSource = dt.DefaultView;

dataGrid1.Colums[1].Visibility = Visibility.Collapsed;

这个方式,需要将页面切换一下才显示效果,否则我想隐藏的那个列一直显示。这个很奇怪。我找了很多方式都无法很好的将列隐藏。请问这个wpf的DataGrid是不是有其他设置才能很好的显示啊?我该如何解决这个问题?

问题补充:

这个DataGrid的显示模板,我只显示了一个列,其他的由DataTable自动生成,我要隐藏的就是DataTable里面的一列。
在绑定的时候,出现一个很奇怪的问题,直接不判断DataGrid的列数,直接使用dataGrid1.Colums[1].Visibility = Visibility.Collapsed;设置隐藏列,会报错:索引超出范围。必须为非负值并小于集合大小。参数:index 

附加:
我发现实际上已经隐藏了列,但是就是在第一次显示的时候没有隐藏,如果进行翻页,或者全选等操作的时候,那个隐藏的列就没有了

王继的主页 王继 | 初学一级 | 园豆:120
提问于:2012-01-12 10:30
< >
分享
最佳答案
0

我也遇到这个问题了,我没有把DataGrid嵌套那么多层,页面直接就是DataGrid,绑定的DataTable,但还是会报索引超出范围的错误,所以应该是DataGrid本身的问题

收获园豆:15
甜甜蛋酥卷 | 菜鸟二级 |园豆:220 | 2012-01-12 14:06

绑定后,不能马上设置那个列不显示,否则会报错。我很奇怪这个问题。不知道你是怎么解决的。

王继 | 园豆:120 (初学一级) | 2012-01-12 14:07

@王继: 在DataGrid的Loaded事件里写dataGrid1.Colums[1].Visibility = Visibility.Collapsed;

甜甜蛋酥卷 | 园豆:220 (菜鸟二级) | 2012-01-12 14:56

@甜甜蛋酥卷: 成功解决。谢谢!

王继 | 园豆:120 (初学一级) | 2012-01-12 15:13
其他回答(3)
0

你试一下修改完Visibility后调用一下这个方法。

 this.dataGrid1.InvalidateVisual();

LCM | 园豆:6876 (大侠五级) | 2012-01-12 10:38

这个方法不行。跟没有使用一样。
我在群里问,有人说,我这个代码就可以实现隐藏,但是主要是第一次不能出现想要的效果,我是在TableControl里面放DataGrid的,并且动态生成TableControl的Item,在每个TableControl下面生成一个DataGrid,然后在DataGrid上绑定DataTable,绑定好之后,设置列的可见性。

支持(0) 反对(0) 王继 | 园豆:120 (初学一级) | 2012-01-12 10:45

@王继: 这跟DataGrid放在TableControl里面有关系?没看出来。

支持(0) 反对(0) LCM | 园豆:6876 (大侠五级) | 2012-01-12 10:53

@LCM: 问题是,我怎么解决这个问题啊。。

支持(0) 反对(0) 王继 | 园豆:120 (初学一级) | 2012-01-12 10:59

@LCM: 我已经用InvalidateVisual();方法在可能出问题的地方都处理了。还是不行。

支持(0) 反对(0) 王继 | 园豆:120 (初学一级) | 2012-01-12 11:11

@王继: 把你DataGrid相关的代码贴出来看看。

支持(0) 反对(0) LCM | 园豆:6876 (大侠五级) | 2012-01-12 11:15

@LCM: 这个太复杂了。。我是一个工程。。。分开写的。。

支持(0) 反对(0) 王继 | 园豆:120 (初学一级) | 2012-01-12 11:20

@王继: 我可以将几个部分的伪代码写出来。主要是公司的工作环境是封闭的,代码不容易考出来。
而且这个代码也有点复杂。

支持(0) 反对(0) 王继 | 园豆:120 (初学一级) | 2012-01-12 11:21

@王继: 你检查一下顺序,绑定DataTable肯定会在你设置列的可见性前面执行吗?

支持(0) 反对(0) LCM | 园豆:6876 (大侠五级) | 2012-01-12 11:26

@LCM: 

我是在a窗体里面加载的uc控件b,然后在uc控件b里面再 加载uc控件c,uc控件c里面加载DateGrid。

然后再在DataGrid上绑定DataTable,

而且在uc控件b里面可以动态添加uc控件c。

uc控件c上面,实现动态分页。

将DataTable分页显示在uc控件c上

支持(0) 反对(0) 王继 | 园豆:120 (初学一级) | 2012-01-12 11:37
0

以上说的都是错误的

正确的应该是LayoutUpdated 事件,而不是Loaded事件。下面是我的例子

  this.dataGrid1.LayoutUpdated += new EventHandler(dataGrid1_LayoutUpdated);

 

 

 

void dataGrid1_LayoutUpdated(object sender, EventArgs e)
{
if(dataGrid1.Columns.Count>=4)
{
this.dataGrid1.Columns[4].Visibility = System.Windows.Visibility.Hidden;
}

}

我测试过 可以用

Angry jack | 园豆:202 (菜鸟二级) | 2012-06-19 08:49

haha,这个栗子好,就是这样子,成功了。

支持(1) 反对(0) 茶水博士 | 园豆:202 (菜鸟二级) | 2015-07-10 14:44
0
BigBosscyb | 园豆:202 (菜鸟二级) | 2021-08-25 16:17
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册