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));
        }
}
}

Datagridview组合框列更改绑定列表数据——>自动显示

我建议在任何想要的属性(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()方法。