我正在使用datagridview,我使用datagridviewcomboboxcolumn,comboboxcolumn显示文本,但问题是我想默认selectcomboboxcolumn的第一项我怎么能这样做
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++; }
可以通过项目属性访问组合框中可用的值
row.Cells[col.Name].Value = (row.Cells[col.Name] as DataGridViewComboBoxCell).Items[0];
如果我在这个事件中知道这件事情,那将会为我节省几天的时间
尝试将其设置为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; } }
如果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; };
设置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(); }
它和我很好地合作
DataGridViews中的ComboBoxes遇到了一些麻烦,没有找到一个优雅的方法来选择第一个值。 然而,这是我最终的结果:
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"); } } } }
对我来说,这看起来很不好意思,但是到目前为止我还找不到更好的方法(也适用于除了字符串以外的复杂对象)。 希望能拯救别人的搜索;)
您需要设置新单元格的项目。 从UI创建新行时,必须由列自动完成。
var cell = new DataGridViewComboBoxCell() { Value = "SomeText" }; cell.Items.AddRange(new String[]{"SomeText", "Abcd", "123"});
一些不同的工作对我来说,我所做的只是设置的时候添加新的记录bu用户与'userAddedRow'事件dtataGridComboBox的值。 对于第一行,我使用了构造函数中的代码。
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"; } }