datagrid单元格之间的等式

时间:2016-08-28 20:42:02

标签: mysql wpf datagrid

我正在制作库存管理程序,所以我有这个数据网格

+==========+==========+==========+==========+
|    C1    |    C2    |    C3    |    C4    |
+==========+==========+==========+==========+

在开始C1和C2从MySQL填充,C3和C4充满了ziros。  当用户改变C3值时,程序用该等式填充C4(C4 = C3 * C2)。  我正在使用UserControl(只能使用System.Windows.Controls事件)。

我不知道如何开始这样做

1 个答案:

答案 0 :(得分:1)

您可以通过Data BindingINotifyPropertyChanged来实现此行为。

首先,您必须创建一个具有四个属性的类(在您的情况下,C1,C2,C3,C4)。

尝试这样的事情。

public class MyClass
{
  public MyClass(int c1, int c2)
  {
     C1 = c1;
     C2 = c2;
     C3 = 0;
  }

  private int c1, c2, c3, c4;

  public int C1
  {
     get { return c1;}
     set { c1 = value; }
  }

  public int C2
  {
     get { return c2;}
     set { c2 = value; }
  }

  public int C3
  {
     get { return c3;}
     set { c3 = value; }
  }

  public int C4
  {
     get { return C3 * C2;}
  }
}

现在,如果您查看该类,我已经创建了一个构造函数,它将接收两个参数c1c2(您的数据库值),C1C2是用这些值初始化。 C3初始化为0. C4只有一个返回C3C2的产品的getter。

现在处理您的方案,当您更改C3时,C4会自动使用C3C2的产品进行更新,您需要INotifyPropertyChanged }

INotifyPropertyChanged

public class MyClass : INotifyPropertyChanged
{
  public MyClass(int c1, int c2)
  {
     C1 = c1;
     C2 = c2;
     C3 = 0;
  }

  private int c1, c2, c3, c4;

  public int C1
  {
     get { return c1;}
     set { c1 = value; }
  }

  public int C2
  {
     get { return c2;}
     set { c2 = value; }
  }

  public int C3
  {
     get { return c3;}
     set { c3 = value; }
  }

  public int C4
  {
     get { return C3 * C2;}
  }

  public event PropertyChangedEventHandler PropertyChanged;

  private void NotifyPropertyChanged(String propertyName = "")
  {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
  }
}

在您的代码隐藏中,使用类型为MyClass ObservableCollection 并将其填充到您的数据库中。

ObservableCollection<MyClass> dbCollection = new ObservableCollection<MyClass>();

ObservableCollection<MyClass> DbCollection 
{
   get { return dbCollection; }
   set { dbCollection = value; }
}

使用您的数据库数据填充此集合。

现在您必须将DataContext的{​​{1}}设置为Window本身。

Window的{​​{1}} Constructor之后,Window

现在进行数据绑定 编辑你的Datagrid来做这样的事情。

InitializeComponents()

现在,您已将Datagrid绑定到Collection。但仍然有一块拼图丢失了。这是关于源属性更改的绑定目标(在本例中为DataGridTextColumn)。

为此你必须编辑MyClass类的属性

this.DataContext = this;

正如您所看到的,参数<DataGrid ItemsSource={Binding DbCollection}> <DataGridTextColumn Binding="{Binding C1, UpdateSourceTrigger="PropertyChanged"}"></DataGridTextColumn> <DataGridTextColumn Binding="{Binding C2, UpdateSourceTrigger="PropertyChanged"}"></DataGridTextColumn> <DataGridTextColumn Binding="{Binding C3, UpdateSourceTrigger="PropertyChanged"}"></DataGridTextColumn> <DataGridTextColumn Binding="{Binding C4, UpdateSourceTrigger="PropertyChanged"}"></DataGridTextColumn> </DataGrid> 中的更改仅通知属性public int C1 { get { return c1;} set { c1 = value; NotifyPropertyChanged("C1"); } } public int C2 { get { return c2;} set { c2 = value; NotifyPropertyChanged("C2"); NotifyPropertyChanged("C4");} } public int C3 { get { return c3;} set { c3 = value; NotifyPropertyChanged("C3"); NotifyPropertyChanged("C4");} } public int C4 { get { return C3 * C2;} } ,但对于c1C1,我们也会通知c2因为{{1} }}是c3C4的乘积。这意味着只要C4C3中的任何一个发生更改,就需要更改C2

我知道在开始时要消化很多,但这是一个完整的解决方案。相信它会解决你的问题。欢迎提出问题。