Как установить SelectedIndex в DataGridViewComboBoxColumn? - PullRequest
6 голосов
/ 28 января 2011

Я использую таблицу данных в том смысле, что я использую datagridviewcomboboxcolumn, comboboxcolumn показывает текст, но проблема в том, что я хочу выбрать первый элемент comboboxcolumn по умолчанию.

DataGridViewComboBoxColumn dgvcb = (DataGridViewComboBoxColumn)grvPackingList.Columns["PackingUnits"];
Globals.G_ProductUtility G_Utility = new Globals.G_ProductUtility();
G_Utility.addUnittoComboDGV(dgvcb);
DataSet _ds = iRawMaterialsRequest.SelectBMR(bmr_ID, branch_ID, "PACKING");
grvPackingList.DataSource = _ds.Tables[0];
int i = 0;
foreach (DataRow dgvr in _ds.Tables[0].Rows)
{
    grvPackingList.Rows[i].Cells["Units"].Value = dgvr["Units"].ToString();
    i++;
}

Ответы [ 7 ]

13 голосов
/ 28 января 2011

Доступные значения в выпадающем списке доступны через свойство items

row.Cells[col.Name].Value = (row.Cells[col.Name] as DataGridViewComboBoxCell).Items[0];
1 голос
/ 14 февраля 2013

Если DataGridViewComboBoxCell уже существует:

DataTable dt = new DataTable();
dt.Columns.Add("Item");
dt.Columns.Add("Value");
dt.Rows.Add("Item 1", "0");
dt.Rows.Add("Item 2", "1");
dt.Rows.Add("Item 3", "2");
dt.Rows.Add("Item 4", "3");

for (int i = 0; i < dvg.Rows.Count; i++)
{
    DataGridViewComboBoxCell comboCell = (DataGridViewComboBoxCell)dvg.Rows[i].Cells[1];
    comboCell.DisplayMember = "Item";
    comboCell.ValueMember = "Value";
    comboCell.DataSource = dt;
};
1 голос
/ 08 мая 2012

Если бы я знал о том, как сделать это в этом событии, это спасло бы мне дни копания и
проб и ошибок при попытке установить правильный индекс в событии CellEnter.

Установка индекса DataGridViewComboBox - это решение, которое я искал ..... СПАСИБО !!!

При рассмотрении всех проблем, с которыми другие кодировщики сталкивались при попытке установить
индекс внутри DataGridViewComboBoxCell, а также после просмотра вашего кода,
все, что кому-то действительно нужно, это:
1. Установите метод события, который будет использоваться для события «EditingControlShowing».
2. Определите метод, которым он будет:
а. Приведите управление событиями в ComboBox.
б. установите для «SelectedIndex» желаемое значение.
В этом примере я просто установил его на «0», но вы, возможно, захотите применить здесь реальную логику.

Вот код, который я использовал:

private void InitEvents()
{

    dgv4.EditingControlShowing += new DataGridViewEditingControlShowingEventHandler( dgv4EditingControlShowing );

}


private void dgv4EditingControlShowing( object sender, DataGridViewEditingControlShowingEventArgs e )
{
   ComboBox ocmb = e.Control as ComboBox;
   if ( ocmb != null )
   {
      ocmb.SelectedIndex = 0;
   }
}
1 голос
/ 14 января 2012

лучший способ установить значение datagridViewComboBoxCell:

DataTable dt = new DataTable();
dt.Columns.Add("Item");
dt.Columns.Add("Value");
dt.Rows.Add("Item1", "0");
dt.Rows.Add("Item1", "1");
dt.Rows.Add("Item1", "2");
dt.Rows.Add("Item1", "3");
DataGridViewComboBoxColumn cmb = new DataGridViewComboBoxColumn();
cmb.DefaultCellStyle.Font = new Font("Tahoma", 8, FontStyle.Bold);
cmb.DefaultCellStyle.ForeColor = Color.BlueViolet;
cmb.FlatStyle = FlatStyle.Flat;
cmb.Name = "ComboColumnSample";
cmb.HeaderText = "ComboColumnSample";
cmb.DisplayMember = "Item";
cmb.ValueMember = "Value";
DatagridView dvg=new DataGridView();
dvg.Columns.Add(cmb);
cmb.DataSource = dt;
for (int i = 0; i < dvg.Rows.Count; i++)
{
dvg.Rows[i].Cells["ComboColumnSample"].Value = (cmb.Items[0] as 
DataRowView).Row[1].ToString();
}

Это сработало у меня очень хорошо

0 голосов
/ 26 декабря 2013

что-то другое сработало для меня, и я просто установил значение dtataGridComboBox, когда добавляется новая запись для пользователя с событием userAddedRow.Для первой строки я использовал код в конструкторе.

public partial class pt_drug : PatientDatabase1_3._5.basic_templet
{
    public pt_drug()
    {
        InitializeComponent();
        dataGridView_drugsDM.Rows[0].Cells[0].Value = "Tablet";
    }

    private void dataGridView_drugsDM_UserAddedRow(object sender, DataGridViewRowEventArgs e)
    {
        dataGridView_drugsDM.Rows[dataGridView_drugsDM.RowCount - 1].Cells[0].Value = "Tablet";
    }


}
0 голосов
/ 10 октября 2012

Вам необходимо установить элементы для новой ячейки.Это должно быть автоматически выполнено столбцом при создании новой строки из пользовательского интерфейса.

 var cell = new DataGridViewComboBoxCell() { Value = "SomeText" };
 cell.Items.AddRange(new String[]{"SomeText", "Abcd", "123"});
0 голосов
/ 24 января 2012

У меня были некоторые реальные проблемы с ComboBox в DataGridViews, и я не нашел элегантного способа выбрать первое значение.Однако вот что я закончил:

public static void InitDGVComboBoxColumn<T>(DataGridViewComboBoxCell cbx, List<T> dataSource, String displayMember, String valueMember)
{
    cbx.DisplayMember = displayMember;
    cbx.ValueMember = valueMember;
    cbx.DataSource = dataSource;
    if (cbx.Value == null)
    {
        if(dataSource.Count > 0)
        {
            T m = (T)cbx.Items[0];
            FieldInfo fi = m.GetType().GetField(valueMember, BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public);
            cbx.Value = fi.GetValue(m);
        }
    }
}

Он в основном устанавливает свойства .Display и .ValueMember объекта DataGridViewComboBoxCell и использует List в качестве источника данных.Затем он берет первый элемент и использует отражение, чтобы получить значение элемента, который использовался в качестве ValueMember, и устанавливает выбранное значение через .Value

Используйте его следующим образом:

public class Customer
{
    private String name;
    public String Name
    {
        get {return this.name; }
        set {this.name = value; }
    }

    private int id;
    public int Id
    {
        get {return this.id; }
        set {this.id = value; }
    }
}

public class CustomerCbx
{
    private String display;
    public String Display
    {
        get {return this.display; }
        set {this.display = value; }
    }

    private Customer value;
    public Customer Value
    {
        get {return this.value; }
        set {this.value = value; }
    }
}

public class Form{
private void Form_OnLoad(object sender, EventArgs e)
{
        //init first row in the dgv
        if (this.dgv.RowCount > 0)
        {
            DataGridViewRow row = this.dgv.Rows[0];
            DataGridViewComboBoxCell cbx = (DataGridViewComboBoxCell)row.Cells[0];

            Customer c1 = new Customer(){ Name = "Max Muster", ID=1 };
            Customer c2 = new Customer(){ Name = "Peter Parker", ID=2 };
            List<CustomerCbx> custList = new List<CustomerCbx>()
            {
                new CustomerCbx{ Display = c1.Name, Value = c1},
                new CustomerCbx{ Display = c2.Name, Value = c2},
            }

            InitDGVComboBoxColumn<CustomerCbx>(cbx, custList, "display", "value");
        }
    }
}
}

Это кажется мне довольно странным, но я не смог найти лучшего способа (он также работает со сложными объектами, кроме Strings).Надеюсь, что это спасет поиск некоторых других;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...