Datagridview组合框列更改绑定列表数据——>自动显示
本文关键字:数据 显示 列表 绑定 组合 Datagridview | 更新日期: 2023-09-27 18:05:52
我想要一个:
BindingList XYZ = new BindingList();
和BindingList的Item具有一行的TextBox-Cell和ComboBox-Cell的数据。如果用户现在更改了ComboBox的数据,他希望将其立即显示在屏幕上。是否可以仅使用一个直接绑定到datagridview的List来实现:
DataSource_of_the_datagridview = XYZ;
如果在ComboBox上发生了变化,那么BindingList的底层数据以及datagridview的显示数据会发生变化吗?
我想使用datagridtextboxcolumn和datagridcomboboxcolumn。在代表一行的对象中我该怎么做呢。我已经在类中为这些对象使用了这个:
class Fahrzeug : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(string propertyName){
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
我建议在任何想要的属性(ies)上引发"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上只有一个REFERENCE,并且修改任何对象,它将在网格中更新自己…
我是这样做的:
http://www.timvw.be/2007/01/17/exploring-datagridviewcomboboxcolumn-databinding/我只能给出一个概述:
有一个TypeCode表示组合框值的一种类型。这是我的主BindingList XYZ的连接点。XYZ是数据集,其中包含一个属性TypeCode。现在可以很容易地将这个XYZ列表绑定到dataGridView。重要的是要绑定每个列的PropertyName。
您应该做的一件事是在visual studio资源管理器中定义列。您可以在datagridview中手动设置希望保存数据的列。例如:用textboxcolumn定义一个列value1,用comboboxcolumn定义一个列value2。
在您的代码中,您现在可以使用您的数据集XYZ:
引用列。this.valuetextboxcolumn.DataPropertyName = "value1";
现在您可以向数据集XYZ添加值。最后用这个来绑定:
this.XYZ_Binding_Source.DataSource = XYZ;
this.dataGridView1.DataSource = this.XYZ_Source;
你必须在你的代码中定义所有这些元素。
现在可以很容易地改变comboboxcolumn的值:
XYZ.TypeCode = TypeCode.valuecode1;
您必须将另一个列表绑定到包含可由用户选择的类型的组合框。
this.DataGridViewComboBoxColumn.DataPropertyName = "TypeCode";
this.DataGridViewComboBoxColumn.DisplayMember = "Label";
this.DataGridViewComboBoxColumn.ValueMember = "TypeCode";
DataPropertyName是XYZ-List中元素的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();
}
代码的简要描述:如果用户单击组合框中的一个数据集,则会产生一个事件,并且现在可以添加用户可以选择的每个数据集。组合框的数据集是非常动态的。如果选择的数据集被添加到xyz列表的属性"typecode"中,则类型代码现在显示在组合框上。之后,自动调用dataGridView1的enddit()方法。