1

I Have Datagridview with combobox inside and i can't set the index in code I read this and this - both not work.

here is my code:

  dgShuffle.DataSource = dtCards;
  DataGridViewComboBoxColumn cmb = new DataGridViewComboBoxColumn();
  cmb.HeaderText = "Select Data";
  cmb.Name = "cmb";
  cmb.MaxDropDownItems = 2;
  cmb.Items.Add("real");
  cmb.Items.Add("sham");

  dgShuffle.Columns.Add(cmb);
  for (int i = 0; i < dgShuffle.RowCount; i++)
  {
       (dgShuffle.Rows[i].Cells[6] as DataGridViewComboBoxCell).Value = "real";
        // dgShuffle.Rows[i].Cells[6].Value = "real";
  }

To set by code i mean : programmatically (depend on the value in datatble). I Dont Get error at all. the value simply not display in the combobox

I checked the index of the combobox and this is correct , below the output from my immediate window:

?dgShuffle.Rows[i].Cells[6]

{DataGridViewComboBoxCell { ColumnIndex=6, RowIndex=0 }} [System.Windows.Forms.DataGridViewComboBoxCell]: {DataGridViewComboBoxCell { ColumnIndex=6, RowIndex=0 }} base: {DataGridViewComboBoxCell { ColumnIndex=6, RowIndex=0 }} AccessibilityObject: {System.Windows.Forms.DataGridViewCell.DataGridViewCellAccessibleObject} ColumnIndex: 6 ContentBounds: {X = 0 Y = 12 Width = 0 Height = 0} ContextMenuStrip: null DefaultNewRowValue: null Displayed: false EditedFormattedValue: "" EditType: {Name = "DataGridViewComboBoxEditingControl" FullName = "System.Windows.Forms.DataGridViewComboBoxEditingControl"} ErrorIconBounds: {X = 0 Y = 0 Width = 0 Height = 0} ErrorText: "" FormattedValue: "" FormattedValueType: {Name = "String" FullName = "System.String"} Frozen: false HasStyle: false InheritedState: Resizable | ResizableSet | Visible InheritedStyle: {DataGridViewCellStyle { BackColor=Color [Window], ForeColor=Color [ControlText], SelectionBackColor=Color [Highlight], SelectionForeColor=Color [HighlightText], Font=[Font: Name=Microsoft Sans Serif, Size=7.8, Units=3, GdiCharSet=177, GdiVerticalFont=False], WrapMode=False, Alignment=MiddleLeft }} IsInEditMode: false OwningColumn: {DataGridViewComboBoxColumn { Name=cmb, Index=6 }} OwningRow: {DataGridViewRow { Index=0 }} PreferredSize: {Width = 43 Height = 26} ReadOnly: false Resizable: true RowIndex: 0 Selected: false Size: {Width = 100 Height = 24} Style: {DataGridViewCellStyle { }} Tag: null ToolTipText: "" Value: null ValueType: {Name = "Object" FullName = "System.Object"} Visible: true

Next try :

  1. I create a new winforms project
  2. Drag datagridview to the default form (from the toolbox)
  3. Copy this code to Form1_Load :

        DataTable dtCards;
        dtCards = new DataTable();
        dtCards.Columns.Add("printedString");
        dtCards.Rows.Add("1");
        dtCards.Rows.Add("2");
        dtCards.Rows.Add("3");
        dtCards.Rows.Add("4");
        dataGridView1.DataSource = dtCards;
    
        DataGridViewComboBoxColumn cmb = new DataGridViewComboBoxColumn();
        cmb.HeaderText = "Select Data";
        cmb.Name = "cmb";
        cmb.MaxDropDownItems = 2;
        cmb.Items.Add("real");
        cmb.Items.Add("sham");
    
        dataGridView1.Columns.Add(cmb);
        for (int i = 0; i < dataGridView1.RowCount; i++)
        {
            (dataGridView1.Rows[i].Cells[6] as DataGridViewComboBoxCell).Value = "real";
            // dgShuffle.Rows[i].Cells[6].Value = "real";
        }
    

What am i missing???

Community
  • 1
  • 1
Natile
  • 193
  • 1
  • 6
  • 20
  • 1
    "i can't set the index in code" what do you mean ? what is your goal exactly ? – Antoine Pelletier Jul 15 '15 at 19:58
  • Wrap it in a `try/catch`, do you get an error? I don't understand the need to cast, the code `dgShuffle.Rows[i].Cells[6].Value = "real";` should work fine as long as that value is available in the drop-down. – Equalsk Jul 15 '15 at 20:53
  • Don't really understand your question. I have just tested your code block and it works fine. Did you set the wrong columns index ? – Nam Bình Jul 16 '15 at 02:25
  • I edited my question. – Natile Jul 16 '15 at 06:11
  • Your ComboBoxColumn show, you can change its value on run-time but can not programmatically ? Ps: Still don't see anything wrong in your code. Could you provide other code that affect your DataGridView ? Maybe try deleting your DataGridView and create new one to avoid design-time errors ? – Nam Bình Jul 16 '15 at 09:44
  • I edited my question again. thanks – Natile Jul 16 '15 at 10:20

1 Answers1

1

You are using datagridview bounded to the data source. You need specify that value in the datasource.

Add value for DataGridViewComboBoxColumn in the data source
Then set DataGridViewComboBoxColumn.DataPropertyName to the name of the column/property of your data source

DataTable dtCards;
dtCards = new DataTable();
dtCards.Columns.Add("printedString");
dtCards.Columns.Add("comboboxValue", typeof(String)); //adding column for combobox
dtCards.Rows.Add("1", "real");
dtCards.Rows.Add("2", "real");
dtCards.Rows.Add("3", "real");
dtCards.Rows.Add("4", "real");


DataGridViewComboBoxColumn cmb = new DataGridViewComboBoxColumn();
cmb.HeaderText = "Select Data";
cmb.Name = "cmb";
cmb.MaxDropDownItems = 2;
cmb.Items.Add("real");
cmb.Items.Add("sham");
cmb.DataPropertyName = "comboboxValue"; //Bound value to the datasource

dataGridView1.Columns.Add(cmb);
dataGridView1.DataSource = dtCards;
Fabio
  • 31,528
  • 4
  • 33
  • 72
  • But what if I want to filter the combobx based on the value I enter to combobox? – Hilal Al-Rajhi Mar 09 '16 at 12:46
  • Is it possible to set difference combobox values for different rows from the same List? – NoWar Aug 25 '17 at 02:16
  • @Dimi, datasource for combobox column shared between all rows. For getting different items for different rows - you should set own items collection for every combobox cell. Check this: [https://stackoverflow.com/a/27202221/1565525](https://stackoverflow.com/a/27202221/1565525) – Fabio Aug 25 '17 at 11:35