web-dev-qa-db-fra.com

DataGridView set cellule de colonne Combobox

J'ai des tables comme ça dans Datagridview:

 Name   Money
 -------------
 Hi      100   //here Combobox with member {10,30,80,100} to choose
 Ki      30    //here Combobox with member {10,30,80,100} to choose

Je souhaite modifier la valeur de la colonne "Argent" dans la zone de liste déroulante

J'ai essayé avec ça mais je ne sais pas plus loin:

DataTable dt = new DataTable();
dt.Columns.Add("Name", typeof(String));
dt.Columns.Add("Money", typeof(String));
dt.Rows.Add(new object[] { "Hi", 100});
dt.Rows.Add(new object[] { "Ki", 30});

DataGridViewComboBoxColumn column = new DataGridViewComboBoxColumn();
var list11 = new List<string>() { "10", "30", "80", "100" };
column.DataSource = list11;
column.ValueMember = "Money";
dataGridView1.Columns.Add(column); 
14
Uni Le

Essaye ça

dataGridView1.AutoGenerateColumns = false;

DataTable dt = new DataTable();
dt.Columns.Add("Name", typeof(String));
dt.Columns.Add("Money", typeof(String));
dt.Rows.Add(new object[] { "Hi", 100 });
dt.Rows.Add(new object[] { "Ki", 30 });

DataGridViewComboBoxColumn money = new DataGridViewComboBoxColumn();
var list11 = new List<string>() { "10", "30", "80", "100" };
money.DataSource = list11;
money.HeaderText = "Money";
money.DataPropertyName = "Money";

DataGridViewTextBoxColumn name = new DataGridViewTextBoxColumn();
name.HeaderText = "Name";
name.DataPropertyName = "Name";

dataGridView1.DataSource = dt;
dataGridView1.Columns.AddRange(name, money);

Utilisez simplement DataPropertyName au lieu de ValueMember

31
yogi

Vous aviez presque fini.

Il n'y a que deux problèmes mineurs:

  1. Dans votre tableau, vous ajoutez aux lignes la valeur "Money" sous forme d'entiers, tandis que dans votre colonne, elles sont définies sous forme de chaîne
  2. Ajoutez d'abord votre annonce de tableau DataGridView DataSource, puis définissez la colonne DataPropertyName

Code complet ci-dessous:

var table = new DataTable();
table.Columns.Add("Name", typeof(string));
table.Columns.Add("Money", typeof(string));
table.Rows.Add("Hi", "100");
table.Rows.Add("Ki", "30");

var column = new DataGridViewComboBoxColumn();
column.DataSource = new List<string>() { "10", "30", "80", "100" };            

dataGridView1.Columns.Add(column);
dataGridView1.DataSource = table;
3
bozydar.sz

Vous pouvez essayer ce qui suit:

DataGridViewComboBoxColumn column = new DataGridViewComboBoxColumn();
column.Name = "Money";
column.DataSource = new string[] { "10", "30", "80", "100" };
dataGridView1.Columns.Add(column);

for (int row = 0; row < dataGridView1.Columns.Count; row++)
{
   DataGridViewComboBoxCell cell = 
       (DataGridViewComboBoxCell)(dataGridView1.Rows[row].Cells["Money"]);
   cell.DataSource = new string[] { "80", "100" };
}

Ou ca:

foreach (DataGridViewRow row in dataGridView1.Rows)
{
    DataGridViewComboBoxCell cell = (DataGridViewComboBoxCell)(row.Cells["Money"]);
    cell.DataSource = new string[] { "10", "30" };
}
1
chridam

Notez l'index de votre colonne ComboBox lorsque vous configurez la grille dans le concepteur. Dans cet exemple, il est 1. La colonne Money est l'index 1. La grille a déjà un membre qui est un DataGridViewComboBoxColumn. Lorsque vous initialisez le formulaire qui contient le contrôle, récupérez-le et initialisez-le. Comme ça:

DataGridViewComboBoxColumn cbc = (DataGridViewComboBoxColumn)dataGridView1.Columns[1];
cbc.Items.Add("10");
cbc.Items.Add("30");
cbc.Items.Add("80");
cbc.Items.Add("100");

Lorsque vous remplissez la grille, insérez des valeurs de texte dans cette cellule. Lorsque l'utilisateur clique sur la cellule, la liste déroulante apparaîtra et il pourra modifier la valeur.

Vraiment, si tout ce que vous voulez faire est simplement d'avoir une liste déroulante avec ces valeurs, vous pouvez le faire directement depuis le concepteur en modifiant la collection Items.

1
Scott

Vous pouvez remplacer par

dt.Columns.Add("Money", typeof(List<string>));
1
Aghilas Yakoub
((DataGridViewComboBoxColumn)dgvFacturas.Columns["estatus"]).DataSource = estatustemp.ToList();
((DataGridViewComboBoxColumn)dgvFacturas.Columns["estatus"]).ValueMember = "Key";
((DataGridViewComboBoxColumn)dgvFacturas.Columns["estatus"]).DisplayMember = "Value";
0
Ranfi Rivas

Vous pouvez le faire très facilement dans Visual Studio Designer comme ceci:

  1. Sélectionnez (clic gauche) la vue de la grille de données (DGV)
  2. Dans les propriétés du DGV, cliquez sur le lien "Editer les colonnes". Une boîte de dialogue s'ouvre.
  3. Sélectionnez la colonne que vous souhaitez modifier en combobox dans la liste "Colonnes sélectionnées"
  4. Dans la partie droite de la boîte de dialogue, dans la section "Propriétés des colonnes non liées", "Conception", recherchez la propriété ColumnType
  5. Modifiez la valeur de la propriété ColumnType en DataGridViewComboBoxColumn
  6. Sauvegarder les modifications
0
Matt

Je sais qu'il est tard mais essayez ceci:

            DataTable dt = new DataTable();
            dt.Columns.Add("Name", typeof(String));
            dt.Columns.Add("Money", typeof(String));
            dt.Rows.Add(new object[] { "Hi", 100 });
            dt.Rows.Add(new object[] { "Ki", 30 });

            DataTable dt2 = new DataTable();
            dt2.Columns.Add("Money", typeof(String));
            dt2.Columns.Add("Meaning", typeof(String));
            dt2.Rows.Add(new object[] { "30" ,"Name 1" });
            dt2.Rows.Add(new object[] { "100", "Name 2" });
            dt2.Rows.Add(new object[] { "80", "Name 3" });
            dt2.Rows.Add(new object[] { "90", "Name4" });

            DataGridViewComboBoxColumn money = new DataGridViewComboBoxColumn();

            money.DataSource = dt2;
            money.HeaderText = "Money";
            money.DataPropertyName = "Money";
            money.DisplayMember = "Meaning";
            money.ValueMember = "Money";

            DataGridViewTextBoxColumn name = new DataGridViewTextBoxColumn();
            name.HeaderText = "Name";
            name.DataPropertyName = "Name";

            DGV.Columns.Add(money);
            DGV.Columns.Add(name);
            DGV.DataSource = dt;
0
Yashar Aliabbasi