在Grid Designer中,添加一列,在这列的ColumnEdit熟悉中,可以选择这列的编辑样式,比如让这列是一个按钮或者选择框等等,这里我们选择下拉框,如图:
这个下拉框默认被命名为repositoryItemComboBox1,我们对这列的操作,就是对repositoryItemComboBox1的操作。
二、绑定数据
这里就不多做解释。我们假设gridview的数据源是dt。
三、repositoryItemComboBox|下拉框的处理
完成上述的内容,当我们运行程序的时候,会发现,datagridview显示datatable中的值,下拉框有我们绑定的数据,但是当我在下拉框中选 择一个值离开后,gridview不会显示我们选中的值,而是回到原值。我们就要想办法让我们选中一个值时,保存到datatable中,这样当我们离开 后,bindingSource自然会刷新gridview,以达到显示选中值的效果。
(1)那么如何实现将选中的值保存到datatable,因为我们的bindingSource绑定的是一个全局的datatable,所以只要获取到选 中值,很容易就能给datatable赋值,到这里容易被难住,因为我们不能像对待其他控件一样,在他的属性中找到他的某某事件,双击进入代码编写,我们 找不到查看repositoryItemComboBox1的属性界面。那就另寻道路,利用委托,于是,我们给下拉框添加事件:editor.SelectedIndexChanged += new EventHandler(DutyOrgEdit_SelectedIndexChanged);
注:editor就是你的下来框,我这里是自己再次封装后的DEV控件。你没有封装就直接是:repositoryItemComboBox1.SelectedIndexChanged += new EventHandler(ComboBoxEdit_SelectedIndexChanged);
private void DutyOrgEdit_SelectedIndexChanged(object sender, EventArgs e)
{
try
{
//1.获取下拉框选中值
var item = (sender as ComboBoxEdit).SelectedItem;
string id = ((System.Collections.Generic.KeyValuePair<string, string>)(item)).Key;//这里是你要保存到数据库的值。因为前面提到过是封装后的控件,所以我的类型是KeyValuePair,这个要根据你自己的类型来。可以调适进去看看你的类型是什么。
string name = ((System.Collections.Generic.KeyValuePair<string, string>)(item)).Value;//这里是你显示的值
//获取选中的行
int dataIndex = this.bizGridView1.GridView.GetDataSourceRowIndex(this.bizGridView1.GridView.FocusedRowHandle);
DataRow info = this.bizGridView1.GridView.GetFocusedDataRow();
dt.Rows[dataIndex]["OwnLabourSerName"] = name;
dt.Rows[dataIndex]["DutyCenterID"] = id;
}
catch (Exception ex)
{
XtraMessageBox.Show(ex.Message, "提示");
}
}
解决办法是,给下拉框在增加一个事件:editor.ParseEditValue += new ConvertEditValueEventHandler(DutyOrg_ParseEditValueprivate)
private void DutyOrg_ParseEditValue(object sender, ConvertEditValueEventArgs e)
{
//截取一下
string value = e.Value.ToString();
if (value.IndexOf(",") >= 0)
value = value.Substring(value.IndexOf(",") + 1, value.Length - value.IndexOf(",") - 2).Trim();
//注:红色的这段是我这里的特殊处理,因为这个当前显示的是[id,name]这种形式的,所以我这里必须特殊处理一下。不需要特殊处理直接e.Value = e.Value.ToString();即可
e.Value = value;
e.Handled = true;
});
这里,就已全部完成咯。在告诉一点:如果想下拉框直接鼠标点击就展现下拉(这样用户体验度是不是好一点呢?)
设置下拉框属性:editor.ImmediatePopup = true;并且GridView1的属性OptionsBehavior.EditorShowMode = DevExpress.Utils.EditorShowMode.MouseDown;即可。
有时候我们会清空当前选中的值,在SelectedIndexChanged事件中增加如下代码:
、var com = (sender as ComboBoxEdit);
com.EditValue = null;
Function.ShowMsg("提示信息!", CYSoft.Common.CYEnumerate.MsgType.Warning);
但是增加了这段代码后, com.EditValue = null;实际上是会报错的。你翻看上面,我们是把错误信息直接抛出来的,所以要把XtraMessageBox.Show(ex.Message, "提示");这个屏蔽掉。
但是我们看到下拉框还有一个事件ParseEditValue。当我们清空当前选中值的时候,ParseEditValue事件里的e.Value是空的,所以我们也需要改造一下这个事件:
if (e.Value != null)
e.Value = e.Value.ToString();
e.Handled = true;
e.Handled = true;
。上面这种方法实际是曲线救国,我暂时没找到其他方法,后面找到更好的办法会更新本文章。