Winfrom中DataGridView的ComboBox功能实现(Gridview下拉框)
本文主要参考:https://www.evget.com/article/2014/10/11/21674.html
查了不少资料,只有这个算给力,可是问题在于这篇文章是教程,也就是说阅读的时候逐步推导实在是有些繁琐,所以我再重新整理一遍,以供参考。
本文想要实现的效果如下:
也就是图中的最后一列。并且有显示文本DisplayText 以及实际值 Value 进行一一对应。和一个实际的 ComboBox 控件所要实现的功能一模一样。
一、绑定前准备
这一部分基本上是一些基础的知识,但也有些地方要注意的。
在Grid Designer中,添加一列,在这列的ColumnEdit熟悉中,可以选择这列的编辑样式,比如让这列是一个按钮或者选择框等等,这里我们选择下拉框,如图:
DevExpress 》 Gridview 》repositoryItemComboBox
这个下拉框默认被命名为repositoryItemComboBox1,我们对这列的操作,就是对repositoryItemComboBox1的操作。
二、代码
1.repositoryItemComboBox 所绑定的是一个对象集,这里为了简易说明,所以对象只有两个属性,显示值 Text 与实际值 Value 。
public class ComboxData
{
public string Text { set; get; }
public string Value { set; get; }
public override string ToString()
{
return Text;
}
}
/// <summary>
/// 绑定RepositoryItemComboBox 值
/// </summary>
/// <param name="combox"></param>
/// <param name="dt"></param>
/// <param name="File_name"></param>
/// <param name="File_code"></param>
public static void RepositoryItemComboBoxDateBinding(RepositoryItemComboBox combox, DataTable dt, string File_name, string File_code)
{
for (int i = 0; i < dt.Rows.Count; i++)
{
ComboxData data = new ComboxData();
data.Text = dt.Rows[i][File_name].ToString().Trim();
data.Value = dt.Rows[i][File_code].ToString().Trim();
combox.Items.Add(data);
}
}
3.这段代码需要结合来看,并且需要仔细想想,看重点
/// <summary>
/// *创建注释*
/// 创建描述:下拉框选中值改变事件
/// 日 期:2017.8.2 15:0
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void ComboBoxEdit_SelectedIndexChanged(object sender, EventArgs e)
{
ComboxData item = new ComboxData();
try
{
//1.获取下拉框选中值
item = (ComboxData)(sender as ComboBoxEdit).SelectedItem;
string Text = item.Text.ToString();
string Value = item.Value.ToString();
//2.获取gridview选中的行
GridView myView = (gridControl1.MainView as GridView);
int dataIndex = myView.GetDataSourceRowIndex(myView.FocusedRowHandle);
//3.保存选中值到datatable(重点)
DataTable dt = (DataTable)this.gridControl1.DataSource;
dt.Rows[dataIndex]["DIS"] = Text; //显示值
dt.Rows[dataIndex]["VALUE"] = Value; //实际值
}
catch (Exception ex)
{
XtraMessageBox.Show(ex.Message, "提示");
}
}
重点在于3小节 保存选中值到datatable,为什么有这么一项操作,因为 RepositoryItemComboBox 下拉框的实现是用 DataTable 中的两列来实现的。下拉框并不是只在一列完成其功能,它需要一列来存储显示值,另一列来存储实际值。
当然,实际值的前台显示视具体情况而定,大多数是隐藏的。
4.选中的值会保存到datatable,但是gridview的单元格不答应,提示对象必须实现Iconvertible
/// <summary>
/// *创建注释*
/// 创建描述:解决IConvertible问题
/// 日 期:2017.8.2 15:16
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void repositoryItemComboBox1_ParseEditValue(object sender, ConvertEditValueEventArgs e)
{
try
{
e.Value = e.Value.ToString();
}
catch (Exception Ex)
{
e = new ConvertEditValueEventArgs();
e.Value = "";
}
e.Handled = true;
}
this.repositoryItemComboBox1.SelectedIndexChanged += new EventHandler(ComboBoxEdit_SelectedIndexChanged2); //下拉框选中值改变事件
this.repositoryItemComboBox1.ParseEditValue += new ConvertEditValueEventHandler(repositoryItemComboBox1_ParseEditValue); //解决IConvertible问题