none
如何获知DataGrid已编辑过 RRS feed

答案

  • 我个人不建议你用DataTable/DataSet结构去绑定在DataGrid上。比较建议你自己设计自己的Entity实例类,然后读取DataTable数据到Entity集合,然后绑定在DataGrid上。

    这样你就可以增加一个属性叫做IsChanged,在我们任何一个实例属性被绑定修改的时候(也就是DataGrid行中一个值被修改,然后同步到实例上的时候)修改为True,这样通过这个属性就可以知道某个实例是否被修改了,进而知道是否这个DataGrid是否被修改了。

    还有一种就是,你的Entity类去实现 IEditableObject 接口,然后我们的DataGrid在进入编辑和退出编辑的时候都会触发Entity的BeginEdit, CancelEdit, EndEdit方法。这个时候我们就可以实现逻辑在这三个方法里面去判断我们的值是否被修改还是被取消修改,进而得知DataGrid有没有被编辑过。

    不过我们也知道,DataRowView 类本身也实现了这个接口,所以我们也可以利用DataTable/DataView中  DataRowView 的这三个方法去知道是否值被修改。

    -----------------------------------------------------------------------------------------

    另外一种方式,就是通过 TemplateColumn 中放置自己修改好的TextBox/TextBlock,在他们被修改的时候标记DataGrid被编辑了。或者直接通过下面的方法去修改DataGridTextColumn样式成自己的控件,在里面增加你的事件处理,来处理编辑时标记整个DataGrid是否被编辑过:

        <DataGrid>
          <DataGrid.Columns>
            <DataGridTextColumn>
              <DataGridTextColumn.ElementStyle>
                <Style TargetType="{x:Type TextBlock}">
                  <EventSetter ...
                </Style>
              </DataGridTextColumn.ElementStyle>
              <DataGridTextColumn.EditingElementStyle>
                <Style TargetType="{x:Type TextBox}">
                  <EventSetter ...
                </Style>
              </DataGridTextColumn.EditingElementStyle>
            </DataGridTextColumn>
          </DataGrid.Columns>
        </DataGrid>
    

     

    Sincerely,
    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    • 已标记为答案 仁虎 2012年1月20日 8:28
    2012年1月16日 4:58
    版主

全部回复

  • 我个人不建议你用DataTable/DataSet结构去绑定在DataGrid上。比较建议你自己设计自己的Entity实例类,然后读取DataTable数据到Entity集合,然后绑定在DataGrid上。

    这样你就可以增加一个属性叫做IsChanged,在我们任何一个实例属性被绑定修改的时候(也就是DataGrid行中一个值被修改,然后同步到实例上的时候)修改为True,这样通过这个属性就可以知道某个实例是否被修改了,进而知道是否这个DataGrid是否被修改了。

    还有一种就是,你的Entity类去实现 IEditableObject 接口,然后我们的DataGrid在进入编辑和退出编辑的时候都会触发Entity的BeginEdit, CancelEdit, EndEdit方法。这个时候我们就可以实现逻辑在这三个方法里面去判断我们的值是否被修改还是被取消修改,进而得知DataGrid有没有被编辑过。

    不过我们也知道,DataRowView 类本身也实现了这个接口,所以我们也可以利用DataTable/DataView中  DataRowView 的这三个方法去知道是否值被修改。

    -----------------------------------------------------------------------------------------

    另外一种方式,就是通过 TemplateColumn 中放置自己修改好的TextBox/TextBlock,在他们被修改的时候标记DataGrid被编辑了。或者直接通过下面的方法去修改DataGridTextColumn样式成自己的控件,在里面增加你的事件处理,来处理编辑时标记整个DataGrid是否被编辑过:

        <DataGrid>
          <DataGrid.Columns>
            <DataGridTextColumn>
              <DataGridTextColumn.ElementStyle>
                <Style TargetType="{x:Type TextBlock}">
                  <EventSetter ...
                </Style>
              </DataGridTextColumn.ElementStyle>
              <DataGridTextColumn.EditingElementStyle>
                <Style TargetType="{x:Type TextBox}">
                  <EventSetter ...
                </Style>
              </DataGridTextColumn.EditingElementStyle>
            </DataGridTextColumn>
          </DataGrid.Columns>
        </DataGrid>
    

     

    Sincerely,
    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    • 已标记为答案 仁虎 2012年1月20日 8:28
    2012年1月16日 4:58
    版主
  • 第一种方案估计会很直接,但感觉太费劲了,如果表多了,各个都写累死了.

    第三种方案,由于绑定到数据集上一定会受到某些影响.

    第二种,省事些,但还是慢一拍.也只有这个方法省事简单些.

    用断点发现了些东西在随之变化,也不知道其是不是可以采取判断的东西,但提取不了

    感谢帮助,祝新年快乐!

    2012年1月20日 8:27
  • 断点下我们可以看到private 和 protected的值 ,这些值可以用反射去取到,但是不推荐使用,这样会破坏封装性。
    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    2012年1月20日 8:37
    版主