DataGrid计算列

时间:2011-11-10 17:09:48

标签: c# wpf datagridview

我正在尝试将我的Excel应用程序转移到WPF数据网格。我要将数据输入到A列,在B列中,我想计算A柱的当前单元格和当前单元格,并添加B列previus单元格。 计算示例:B2 = B1 +(A2-A1)。这样做的最佳方法是什么?

2 个答案:

答案 0 :(得分:4)

最好的方法是在类中实现该逻辑,并将网格绑定到相应的属性。例如:

class SomeData 
{
  int A { get; set; }
  int B { get; set; }
  int AminusB { get { return A - B; } }
}

答案 1 :(得分:4)

就个人而言,我首先要创建一个代表记录的类,并在该类上实现INotifyPropertyChanged。

public class recordObject : INotifyPropertyChanged
{
    private int a;
    public int A 
    { 
        get
        {
            return a;
        }
        set
        {
            a = value;
            OnPropertyChanged("A");
        }
    }

    private int b;
    public int B
    { 
        get
        {
            return b;
        }
        set
        {
            b = value;
            OnPropertyChanged("B");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

然后,在您正在显示数据网格的窗口后面的代码中,您将要在列表中的每个对象上订阅PropertyChanged。然后,只要这些属性发生更改,您就必须手动计算列值。我知道,但它确实有效。

属性更改事件将如下所示:

void recordObject_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    var objectList = DataGrid.ItemsSource as List<recordObject>;
    var myRecord = sender as recordObject;
    if (objectList != null && myRecord != null)
    {
        int idx = objectList.IndexOf(myRecord);
        // Perform your calculations here using idx to access records before and after the current record
        // making sure to check for list boundaries for top and bottom.
        // Also note that this will likely kick off cascading event calls so make sure you're only changing
        // the previous or following record object.
    }
}

如果将此事件挂钩到绑定列表中的所有记录,则只要任何属性发生更改,它就会触发。在上面的类中,它适用于A和B.您可以通过e.PropertyName(简单的字符串比较)过滤您感兴趣监视的属性,并相应地处理业务逻辑。如果要维护封装,或者至少将对象的业务逻辑放在对象本身上,则此方法可以是类recordObject上的静态方法。但是,您必须提供从该静态方法获取datagrid(可能通过窗口上的静态属性)。所以:

public static void recordObject_PropertyChanged(object sender, PropertyChangedEventArgs e)

并连接如此:

record.PropertyChanged += new PropertyChangedEventHandler(recordObject.recordObject_PropertyChanged);