【问题标题】:c# Set value to a DataRow automaticallyc#自动将值设置为DataRow
【发布时间】:2014-12-01 16:06:24
【问题描述】:

如果单元格编号 3 更改,我想要做的是更改行的第四个单元格的值。我的网格有一个 EditEnding 方法。这是我下面的方法。我真的不知道如何完成它

这就是网格定义:

<DataGrid x:Name="dataGrid1"... CellEditEnding="dataGrid1_EditEnding">

以及方法:

private void dataGrid1_EditEnding(object sender, DataGridCellEditEndingEventArgs e)
{
    // initializing DataRowView from my datagrid
    DataRowView drv = (DataRowView)dataGrid1.CurrentItem;

    // checking if there were any changes
    if (drv.Row[3, DataRowVersion.Original] != drv.Row[3])
    {
       //set value to cell
    }
}

【问题讨论】:

  • 单元 3 位于索引 2

标签: c# wpf datarowview


【解决方案1】:

不要编辑 datagridrow - 在 wpf 中编辑底层对象!

这意味着当绑定到单元格 3 的属性发生更改时,请更改绑定到单元格 4 的属性。INotifyPropertyChanged 将通知您的网格并显示您的更改

【讨论】:

  • 为什么?当我在 DataGrid 和 DataTable 之间设置适当的绑定时,当我在 DataTable 中更改一行时它们都应该编辑
  • ??您写道,当另一个单元格发生更改时,您想更改一个单元格的值。我只是说你应该采用 mvvm 方式,这意味着:当一个属性(绑定到 cell3)发生变化时,改变另一个属性(cell 4)为什么你想在代码隐藏中做一些事情?
【解决方案2】:

如果您在 cell3 更改时已经有计算 cell4 值的逻辑,那么当绑定到第 3 列的属性发生更改时,您应该调用绑定到第 3 列和第 4 列的属性的 INotifyPropertyChanged。

【讨论】:

    【解决方案3】:
    嗯,我做了我的东西,只是忘了在这里发布它。

    首先我用编辑事件做了它,它看起来像:

    private void dataGrid1_EditEnding(object sender, DataGridCellEditEndingEventArgs e)
    {
        DataRowView drv = (DataRowView)dataGrid1.CurrentItem;
    
        if (drv.Row[3, DataRowVersion.Original] != drv.Row[3])
        {
           rowView.Row.SetField(4, /* my logic here */);
        }
    }
    

    问题是它仅在第二个编辑中添加了该值。然后我更改了我的想法,并将一个划船的事件添加到我的DataTable中,这就像那样:

        static void dtSP_RowChanged(object sender, DataRowChangeEventArgs e)
        {
            bool temp = false;
    
            try
            {
    
                temp = e.Row[4, DataRowVersion.Original] == e.Row[4];
            }
            catch { }
    
            if (temp && int.Parse(e.Row[3].ToString()) != -1)
            {
                e.Row[4] = (/* my logic */);
            }
        }
    

    该方法进入无穷大循环(它注意到,第四行已更改)。

    然后我看到了这个: http://www.windowsdevcenter.com/pub/a/dotnet/2003/05/26/datacolumn_expressions.html

    我已经以一行长代码结束:

    dtSP.Columns[4].Expression = "expression";
    

    @blindmeis,我忘记提到我使用ADO.NET,抱歉

    【讨论】:

    • 我不知道CurrentItem存在于现在......这样的有用财产。 span>
    猜你喜欢
    • 1970-01-01
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    • 2012-11-30
    • 1970-01-01
    • 2011-03-21
    • 1970-01-01
    • 2018-10-19
    相关资源
    最近更新 更多