遍历datagrid的所有行时,纵向滚动条一下看不到的行取不到

别吵_我睡会儿先 2012-06-16 06:25:09
在silverlight中,遍历一个datagrid的所有行,取第一列的checkbox的选中状态时,


foreach (object ovj in DataGridTMSection.ItemsSource)
{
if (DataGridTMSection.Columns[0].GetCellContent(ovj) != null)//前7行能取到,但是滚动条一下看不到的就为null了,怎么办呢?
{
CheckBox cb1 = DataGridTMSection.Columns[0].GetCellContent(ovj) as CheckBox;
StRvsectBVO model = ovj as StRvsectBVO;
if (model.SS==1 && model != null)
{
index++;
}
}
}


...全文
269 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
在silverlight中,遍历一个datagrid的所有行,取第一列的checkbox的选中状态时,

.......[/Quote]

你这里很典型地缺乏界面设计模式的思路。

通常来说,数据列在datagrid的模板列定义中,已经被定义为双向绑定到模型数据对象的具体属性上。那么当用户改变checkbox的时候,对应的数据源中的数据对象的那个对应属性也实时改变了。用不着你去遍历什么界面控件

举个例子吧,假设界面上有一个红绿灯,还有一个“道岔”图像,假设绿灯的时候道岔总是升起的,而红灯的时候总是落下的。在设计这个界面的时候,你就应该将界面上这两个表现层面的东西分别双向绑定到界面背后的数据模型对象的一个bool属性上,这样当用户点亮红灯时自然就会使道岔落下,当用户抬起道岔时自然就会让绿灯点亮。而当你要按照数据的概念去取得结果的时候,应该去访问界面背后的数据模型对象,而不用去访问什么界面控件。
  • 打赏
  • 举报
回复
这是不可能遍历的!

datagrid只是一个表现层控件而已,它有权利自由地作出设计改变,跟你想当然的理解完全可能不同。你不应该靠遍历它的行去获取数据,你应该重新审视你的系统设计,看看能不能取得datagrid的ItemsSource数据。

实际上datagrid只有用户可见的部分才初始化行。当滚动条滚动内容的时候,那些滚出去的行对象立刻被重用于新的滚入的行,所以跟你想当然地以为的行的概念就是不同的。

在一个行滚出去的时候,就会触发 datagrid 的UnloadingRow事件。紧接着,当这行又被重用于显示新的滚入的数据行,就又触发 LoadingRow 事件。这就是其基本原理。
wwwljh 2012-06-17
  • 打赏
  • 举报
回复
foreach (object ovj in DataGridTMSection.ItemsSource)
{
CheckBox cb1 = DataGridTMSection.Columns[0].GetCellContent(ovj) as CheckBox;
StRvsectBVO model = ovj as StRvsectBVO;
if (model.SS==1 && model != null)
{
index++;
}
}

8,757

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧