I want to have one:
BindingList XYZ = new BindingList();
and an Item of BindingList has data of a TextBox-Cell and a ComboBox-Cell of one row. If the user now changing data of the ComboBox, he wants to display it immediately on the screen. Can it be achieved with only one List which is directly bind to the datagridview:
DataSource_of_the_datagridview = XYZ;
Could it happen if there is a change on the ComboBox, that the underlying data of the BindingList and furthermore also the displayed data of the datagridview will be changed?
I want to use datagridtextboxcolumn and datagridcomboboxcolumn. What do i should do in my object which represents one row. I have already used this in the class for thes object-rows:
class Fahrzeug : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(string propertyName){
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
答案 0 :(得分:0)
我建议提高" PropertyChanged"任何所需属性上的事件(在其setter中),这将实时通知绑定对象的更改,UI将处理它们。
我们在基类中使用类似的东西:
DataGridView.BindingList = new BindingList<object who inherits this>()
public void SetFieldValue<T>(T field, T value, params string[] propertyNames)
{
Foreach var propName In PropertyNames
{
NotifyPropertyChanged(propName)
}
}
然后确认你在这个BindingList上有一个参考,并修改任何对象,它将在网格中更新自己......
答案 1 :(得分:0)
我已经完成了这个教程:
http://www.timvw.be/2007/01/17/exploring-datagridviewcomboboxcolumn-databinding/
我只能概述一下:
有一个TypeCode代表一个ComboBox-Values类型。 这是我的主BindingList XYZ的连接点。 XYZ是数据集,其中包含一个属性TypeCode。您现在可以轻松地将此XYZ列表绑定到dataGridView。重要的是绑定每列的PropertyName。
您应该做的一件事是在Visual Studio资源管理器中定义列。您可以在datagridview中手动设置要包含数据的列。例如:使用textboxcolumn定义列value1,使用comboboxcolumn定义value2。
在您的代码中,您现在可以使用数据集XYZ引用该列:
this.valuetextboxcolumn.DataPropertyName = "value1";
现在您可以向数据集XYZ添加值。 和finallay绑定它:
this.XYZ_Binding_Source.DataSource = XYZ;
this.dataGridView1.DataSource = this.XYZ_Source;
您还必须在代码中定义所有这些元素。
现在可以使用以下行轻松更改组合框列的值:
XYZ.TypeCode = TypeCode.valuecode1;
您必须将另一个列表绑定到包含可由用户选择的类型的组合框。
this.DataGridViewComboBoxColumn.DataPropertyName = "TypeCode";
this.DataGridViewComboBoxColumn.DisplayMember = "Label";
this.DataGridViewComboBoxColumn.ValueMember = "TypeCode";
DataPropertyName是来自XYZ-List的Element的TypeCode的变量,以及绑定到组合框的每个元素的TypeCode。如果现在键入组合框按钮,则会看到绑定到组合框的每个元素的“标签”。并且包含组合框的值也是TypeCode。 您现在可以将几个列表项添加到组合框列表中,如下所示:
bindingList.Add(new Type(LabelText, TypeCode.valuecode1));// only an example
正如您在timvw教程中看到的那样,您必须使用此事件方法评估用户输入:
void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
if (this.dataGridView1.CurrentCell.ColumnIndex == this.DataGridViewComboBoxColumn.Index)
{
BindingSource bindingSource = this.dataGridView1.DataSource as BindingSource;
XYZ xyz = bindingSource.Current as XYZ;
BindingList<Type> bindingList = this.add_all_data_sets_which_can_be_chosen();
DataGridViewComboBoxEditingControl comboBox = e.Control as DataGridViewComboBoxEditingControl;
comboBox.DataSource = bindingList;
if (xyz.TypeCode != null)
{
comboBox.SelectedValue = xyz.TypeCode;
}
else
{
comboBox.SelectedValue = string.Empty;
}
comboBox.SelectionChangeCommitted -= this.comboBox_SelectionChangeCommitted;
comboBox.SelectionChangeCommitted += this.comboBox_SelectionChangeCommitted;
}
}
void comboBox_SelectionChangeCommitted(object sender, EventArgs e)
{
this.dataGridView1.EndEdit();
}
代码的简要说明: 如果用户单击组合框的一个数据集,则事件会上升,现在可以添加用户可以选择的每个数据集。 Combobox的数据集非常动态。如果将所选数据集添加到XYZ列表的属性“typecode”,则类型代码现在显示在组合框中。在此之后,将自动调用dataGridView1的endit()方法。