c# - 将绑定(bind)的组合框添加到数据 GridView

标签 c# mysql visual-studio-2010 datagridview

场景和http://arsalantamiz.blogspot.com/2008/09/binding-datagridview-combobox-column.html几乎一样.但我无法让它在 c# 上工作...

我的 mySql 数据库有两个表: 1. 协议(protocol) 2.pcap数据

在协议(protocol)表中我有两个字段:idprotocols 和 protocolName

在 pcaps 表中我有 wizardProtocol(“链接”到 idprotocols 字段)

我想要得到的是有一个组合框,其中包含将替换 wizardprotocol 字段的名称。接下来,如果用户更新“名称”组合框,wizardProtocol 将相应更改(因此我将能够相应地更新数据库中的更改)。

现在,在网上看了一些资料:我写了下面的代码:

  public void Bind(ref DataGridView dataGridView)
    {
        try
        {

            mySqlDataAdapter = new MySqlDataAdapter(SELECT_ALL_PCAP, _con);
            mySqlCommandBuilder = new MySqlCommandBuilder(mySqlDataAdapter);

            mySqlDataAdapter.UpdateCommand = mySqlCommandBuilder.GetUpdateCommand();
            mySqlDataAdapter.DeleteCommand = mySqlCommandBuilder.GetDeleteCommand();
            mySqlDataAdapter.InsertCommand = mySqlCommandBuilder.GetInsertCommand();
            dataSet = new DataSet();
            mySqlDataAdapter.Fill(dataSet, "pcap");


            MySqlDataAdapter adp2 = new MySqlDataAdapter(SELECT_ALL_PROTOCOL, _con);
            MySqlCommandBuilder builder = new MySqlCommandBuilder(adp2);

            adp2.UpdateCommand = builder.GetUpdateCommand();
            adp2.DeleteCommand = builder.GetDeleteCommand();
            adp2.InsertCommand = builder.GetInsertCommand();
            adp2.Fill(dataSet, "protocol");


            bindingSource = new BindingSource();
            bindingSource.DataSource = dataSet;
            bindingSource.DataMember = "pcap";
            dataGridView.DataSource = bindingSource;


            dataGridView.Columns["length"].ReadOnly = true;
            dataGridView.Columns["length"].DefaultCellStyle.ForeColor = System.Drawing.Color.SandyBrown;
            dataGridView.AllowUserToAddRows = false;
            dataGridView.AllowUserToDeleteRows = false;


            DataGridViewComboBoxColumn colType = new DataGridViewComboBoxColumn();
            colType.HeaderText = "Type";
            colType.DropDownWidth = 90;
            colType.Width = 90;
            colType.DataPropertyName = "wizardProtocol";
            colType.DataSource = bindingSource;
            colType.DisplayMember = "protocolName";
            colType.ValueMember = "idprotocols";
            dataGridView.Columns.Insert(dataGridView.Columns.GetColumnCount(DataGridViewElementStates.None) - 1, colType);


        }
        catch (System.Exception e)
        {
            MessageBox.Show(e.ToString());
        }
    }

我正在尝试操纵 DisplayMember 属性,但我失败了(我知道问题可能出在我的数据绑定(bind)上,但我想不通...)

更新:感谢回答,我重新附上固定代码

            mySqlDataAdapter = new MySqlDataAdapter(SELECT_ALL_PCAP, _con);
            mySqlCommandBuilder = new MySqlCommandBuilder(mySqlDataAdapter);

            mySqlDataAdapter.UpdateCommand = mySqlCommandBuilder.GetUpdateCommand();
            mySqlDataAdapter.DeleteCommand = mySqlCommandBuilder.GetDeleteCommand();
            mySqlDataAdapter.InsertCommand = mySqlCommandBuilder.GetInsertCommand();
            dataSet = new DataSet();
            mySqlDataAdapter.Fill(dataSet, "pcap");


            MySqlDataAdapter adp2 = new MySqlDataAdapter(SELECT_ALL_PROTOCOL, _con);
            MySqlCommandBuilder builder = new MySqlCommandBuilder(adp2);

            adp2.UpdateCommand = builder.GetUpdateCommand();
            adp2.DeleteCommand = builder.GetDeleteCommand();
            adp2.InsertCommand = builder.GetInsertCommand();
            adp2.Fill(dataSet, "protocol");



            bindingSource = new BindingSource();
            bindingSource.DataSource = dataSet;
            bindingSource.DataMember = "pcap";
            dataGridView.DataSource = bindingSource;
            dataGridView.AllowUserToAddRows = false;
            dataGridView.AllowUserToDeleteRows = false;


            DataGridViewComboBoxColumn colType = new DataGridViewComboBoxColumn();
            BindingSource wizardBindingSource = new BindingSource();
            wizardBindingSource.DataSource = dataSet; 
            wizardBindingSource.DataMember = "protocol";
            colType.HeaderText = "Type";
            colType.DropDownWidth = 90;
            colType.Width = 90;
            colType.DataPropertyName = "wizardProtocol";
            colType.DataSource = wizardBindingSource;
            colType.DisplayMember = "protocolName";
            colType.ValueMember = "idprotocols";
            dataGridView.Columns.Insert(dataGridView.Columns.GetColumnCount(DataGridViewElementStates.None) - 1, colType); 

最佳答案

您做错的最明显的事情是您对 datagridview 和 comboboxcolumn 使用相同的绑定(bind)源。如果查看您提供的示例,您会注意到它们创建了第二个绑定(bind)源 productBindingSource。

因此,您需要做的是创建一个绑定(bind)源(我们称它为 wizardProtocolBindingSource),然后用协议(protocol)表中的数据填充它。这将成为您的组合框列的数据源。

关键代码看起来像这样:

// You bind the datagridview just as before
// this dataset should have the idprotocols field which is your foreign key
// to the protocols table - you will probably want this to be hidden.
bindingSource = new BindingSource(); 
bindingSource.DataSource = dataSet; 
bindingSource.DataMember = "pcap"; 
dataGridView.DataSource = bindingSource; 

// hide the foreign key column
dataGridView.Columns["idProtocols"].Visible = false;

// here we populate your comboboxcolumn binding source
wizardProtocolBindingSource= new BindingSource(); 
// this dataset is from the protocols table
wizardProtocolBindingSource.DataSource = dataSet; 

// Add the combobox column
DataGridViewComboBoxColumn colType = new DataGridViewComboBoxColumn();      
colType.HeaderText = "Type";      
colType.DropDownWidth = 90;      
colType.Width = 90;      
colType.DataSource = wizardProtocolBindingSource;      
// The DataPropertyName refers to the foreign key column on the datagridview datasource
colType.DataPropertyName = "wizardProtocol";    
// The display member is the name column in the column datasource  
colType.DisplayMember = "protocolName";    
// The value member is the primary key of the protols table  
colType.ValueMember = "idprotocols";    
// I usually just add the column but you can insert if you need a particular position  
dataGridView.Columns.Add(colType);      

以上应该对你有用,虽然我不知道你的数据集列的名称我不得不猜测一点。

关于c# - 将绑定(bind)的组合框添加到数据 GridView ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7582705/

相关文章:

c# - Windows 窗体应用程序中使用的 CSCore 库

php - 如何在 PHP OOP 中设置通知消息

visual-studio-2010 - 每次重新启动后 Visual Studio 2010 "cannot find"C :\Users\[USERNAME]\AppData\Local\Temp\1\. NETFramework,Version=v4.0.AssemblyAttributes.vb

c++ - 将c++程序与mysql连接时出现意外错误

c# - 有没有一种简单的方法来检查重复的快捷键?

c# - 在 Metro App 中创建样式 BasedOn StandardStyles.xaml

c# - EVENTTARGET 确定发件人时出现问题

c# - 将服务注入(inject) Action Filter

php - 如何在 PHP/MYSQL 中将两个 mysql 查询作为一个执行?

php - 如何在mysql查询中使用varchar类型的大于运算符