locked
如何遍历DataGrid的行? RRS feed

  • 问题

  • 在使用DataGrid的过程中,有时需要遍历DataGrid的行,但没有找到相关属性或方法。
    请各位老大指教!

    简明需求:
    在DataGrid中显示一个CheckBox列,DataGrid外部有一个按钮,点击按钮后获取该DataGrid中的所有CheckBox为True的DataContext
    2009年6月10日 10:36

答案

  • 其实要做到这个效果有很多方法.如果你不想用这个方法还有种选择,那就是在check/uncheck这个CheckBox的时候把本身的DataContext加到链表里或者从链表中移除.然后只要遍历这个链表就能拿到所有选中的数据了.
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    • 已标记为答案 懵盛盛 2009年6月16日 6:25
    2009年6月16日 6:06

全部回复

  • 最好不要试图遍历DataGrid的行,而是遍历DataGrid所绑定的ItemsSource.

    因为DataGrid的行是Virtualize的,举例说,比如你一共有100条数据,但是你的窗口只显示10行,那么DataGrid只创建10个 Row 的实例,当你滚动的时候,移出的行会被再重新绑定给新移入的行。所以你直接遍历行是不可行的(除非都显示出来,或者用Program滚动)。 http://blogs.msdn.com/xusun/archive/2008/11/09/datagrid-in-silverlight-row-recycling.aspx

    因为DataGrid和后方数据是绑定的,所以简单的方法就是便利后面的数据。

    2009年6月10日 22:03
  • 最好不要试图遍历DataGrid的行,而是遍历DataGrid所绑定的ItemsSource.

    因为DataGrid的行是Virtualize的,举例说,比如你一共有100条数据,但是你的窗口只显示10行,那么DataGrid只创建10个 Row 的实例,当你滚动的时候,移出的行会被再重新绑定给新移入的行。所以你直接遍历行是不可行的(除非都显示出来,或者用Program滚动)。 http://blogs.msdn.com/xusun/archive/2008/11/09/datagrid-in-silverlight-row-recycling.aspx

    因为DataGrid和后方数据是绑定的,所以简单的方法就是便利后面的数据。


    你好,你的意思我明白了,谢谢你提供的文章!
    那么我问要怎样才能完成我提出的简明需求呢?(在不改变实体模型的情况下)
    2009年6月11日 1:02
  • 遍历children....


    紫柔版主的头像真叫萌得一个不行啊。。。。
    答案800 撒花
    2009年6月11日 2:42
  • 遍历children....


    紫柔版主的头像真叫萌得一个不行啊。。。。
    答案800 撒花

    DataGrid没有Children属性哦
    2009年6月11日 12:24
  • 不明白你为什么不去遍历所绑定的数据。

    如果你真的非要去遍历UI上的东西,你可以通过dataGrid.LoadingRow event来获得DataGridRow的实体。然后dataGrid.Columns[i].GetCellContent(DataGridRow)来获得具体的DataGridCell里所含的控件。
    2009年6月11日 21:58
  • 不明白你为什么不去遍历所绑定的数据。

    如果你真的非要去遍历UI上的东西,你可以通过dataGrid.LoadingRow event来获得DataGridRow的实体。然后dataGrid.Columns[i].GetCellContent(DataGridRow)来获得具体的DataGridCell里所含的控件。
    你好,我的需求在帖子里,应该是不可以遍历数据的,而且LoadingRow Event也帮我不了我……
    简明需求:
    在DataGrid中显示一个CheckBox列,DataGrid外部有一个按钮,点击按钮后获取该DataGrid中的所有CheckBox为True的DataContext
    2009年6月13日 16:54
  • 你好,
    根据你的需求,你并不是要得到CheckBox本身.这样你其实可以在数据源里加一个属性,双向绑定IsChecked, 然后遍历数据源就能知道是哪些数据源对象被勾选了.


    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    2009年6月15日 9:19
  • 你好,
    根据你的需求,你并不是要得到CheckBox本身.这样你其实可以在数据源里加一个属性,双向绑定IsChecked, 然后遍历数据源就能知道是哪些数据源对象被勾选了.


    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    你好,谢谢你的答复!
        由于数据模型(实体)本身并不包含该属性,加上一个“是否被选”属性似乎不合逻辑。
        而且由于数据表通用,都加上了CheckBox,只需要传入ItemSource即可,这样修改数据模型就显得很无谓了。
    2009年6月15日 11:49
  • 其实要做到这个效果有很多方法.如果你不想用这个方法还有种选择,那就是在check/uncheck这个CheckBox的时候把本身的DataContext加到链表里或者从链表中移除.然后只要遍历这个链表就能拿到所有选中的数据了.
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    • 已标记为答案 懵盛盛 2009年6月16日 6:25
    2009年6月16日 6:06
  • 其实要做到这个效果有很多方法.如果你不想用这个方法还有种选择,那就是在check/uncheck这个CheckBox的时候把本身的DataContext加到链表里或者从链表中移除.然后只要遍历这个链表就能拿到所有选中的数据了.
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    这是个好方法……我总按着ASP.NET的思路走,走错路了
    谢谢
    2009年6月16日 6:26
  • 孙逊,你好~

    我也遇到同样的问题,使用的方法如下,但有几个问题:

    foreach (object o in dg.ItemsSource)
    {
        CheckBox cb1 = dg.Columns[0].GetCellContent(o).FindName("checkbox") as CheckBox;
        cb1.IsChecked = true;
    }

    问题1:
    在 foreach 会抛出“未将对象引用设置到对象的实例”的异常。

    问题2:
    通过这种方式遍历的Checkbox,在排序后就会出现你的Blog中所描述的问题。全选按钮也没有效果了。所以正如你所回答的通过数据绑定可以完美解决。我的数据是反序列化得到的,不知道怎么加一个IsChecked属性。

    2009年6月20日 14:34
  • 孙逊,你好~

    我也遇到同样的问题,使用的方法如下,但有几个问题:

    foreach (object o in dg.ItemsSource)
    
    {
    
        CheckBox cb1 = dg.Columns[0].GetCellContent(o).FindName("checkbox") as CheckBox;
    
        cb1.IsChecked = true;
    
    }
    
    

    问题1:
    在 foreach 会抛出“未将对象引用设置到对象的实例”的异常。

    问题2:
    通过这种方式遍历的Checkbox,在排序后就会出现你的Blog中所描述的问题。全选按钮也没有效果了。所以正如你所回答的通过数据绑定可以完美解决。我的数据是反序列化得到的,不知道怎么加一个IsChecked属性。


    你好,我也开始也在苦苦思索这个问题,但后来发现自己的思维一直都停留在ASP.NET的时代……
    遍历DataGrid的行然后对比,或许是HTML中比较常用的方法,但后来经过Allen Chen的指导,才发现自己是多么的愚蠢……
    不需要加任何属性,不需要循环,只需要在CheckBox的事件里,把CheckBox的DataContext放入链表中,即可获得被“勾选”的数据了。
    2009年6月23日 1:06
  • 你好~
    我现在通过在数据源中设置IsChecked = true可以使Datagrid中的checkbox列选中,但是却存在着刷新问题。
    点击全选后,Datagrid没有反应,但是通过拖动滚动条发现,其实已经选中。
    我想问下这种情况怎么处理啊。

    2009年6月23日 2:00
  • 你好~
    我现在通过在数据源中设置IsChecked = true可以使Datagrid中的checkbox列选中,但是却存在着刷新问题。
    点击全选后,Datagrid没有反应,但是通过拖动滚动条发现,其实已经选中。
    我想问下这种情况怎么处理啊。


    你好~ 找到了解决方案了吗?
    2009年11月27日 10:19
  • 哦,都不记得了~真是不好意思~
    你也遇到了同样的问题了么?

    2009年11月27日 14:16
  • 兄弟,怎么解决的?
    2011年7月28日 5:17