如何在DataGridViewComboBoxColumn中设置SelectedIndex?

时间:2011-01-28 05:40:55

标签: c# windows

我正在使用datagridview,因为我正在使用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 个答案:

答案 0 :(得分:13)

可以通过items属性

访问组合框中可用的值
row.Cells[col.Name].Value = (row.Cells[col.Name] as DataGridViewComboBoxCell).Items[0];

答案 1 :(得分:1)

如果我知道在这个事件中这样做,它将节省我挖掘和日子的日子 尝试将其设置为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;
   }
}

答案 2 :(得分:1)

如果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;
};

答案 3 :(得分:0)

设置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();
}

它非常适合我

答案 4 :(得分:0)

我在DataGridViews中使用ComboBox遇到了一些麻烦,但没有找到一种优雅的方法来选择第一个值。然而,这就是我最终的结果:

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

它基本上设置了DataGridViewComboBoxCell的.Display和.ValueMember属性,并使用List作为DataSource。然后它接受第一个项目,并使用反射来获取用作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之外,它还适用于复杂的对象)。希望能省去其他人的搜索;)

答案 5 :(得分:0)

您需要为新单元格设置项目。从UI创建新行时,该列必须由列自动完成。

 var cell = new DataGridViewComboBoxCell() { Value = "SomeText" };
 cell.Items.AddRange(new String[]{"SomeText", "Abcd", "123"});

答案 6 :(得分:0)

对我来说不同的东西我做的是简单地设置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";
    }


}