Ajout de la liste déroulante liée à datagridview

Le scénario est presque identique à celui de http://arsalantamiz.blogspot.com/2008/09/binding-datagridview-combobox-column.html . mais je ne peux pas le faire fonctionner sur c #

J’ai la firebase database mySql avec deux tables: 1. protocoles 2. pcapdata

Dans les tables de protocoles, j’ai deux champs: idprotocols et protocolName

Dans la table pcaps j’ai wizardProtocol (qui est “lié” au champ idprotocols)

Ce que j’essaie d’obtenir, c’est d’avoir une liste déroulante contenant des noms qui remplaceront le champ wizardprotocol. Ensuite, si l’utilisateur met à jour la liste déroulante “noms”, wotProtocol sera modifié en conséquence (pour que je puisse mettre à jour les modifications dans la firebase database en conséquence).

Maintenant, après avoir lu quelques informations sur le net: J’ai écrit le code suivant:

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.ToSsortingng()); } } 

J’essaie de manipuler la propriété DisplayMember, mais j’échoue (je sais que le problème vient probablement de ma liaison de données, mais je n’arrive pas à le comprendre …)

UPDATE: Merci à la réponse, je re-attache le code fixe

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

La chose la plus évidente que vous faites mal est que vous utilisez la même source de liaison pour votre datagridview et pour votre comboboxcolumn. Si vous examinez l’exemple que vous avez fourni, vous remarquerez qu’ils créent un second produit binding source, productBindingSource.

Vous devez donc créer une source de liaison (appelons-la wizardProtocolBindingSource), que vous remplissez ensuite avec les données de votre table de protocoles. Cela devient la source de données de votre colonne de liste déroulante.

Le code de la clé ressemble à ceci:

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

Ce qui précède devrait fonctionner pour vous, même si je ne connaissais pas les noms des colonnes de votre dataset, je devais le deviner un peu.