尝试在Treelist中绑定RepositoryItemCheckedComboBoxEdit控件,结果会绑定数据,却不知道如何返回数据了,反复了几天。
因为本需求比较奇葩(下拉框值都不一样,显示值与真实值不一样),最后使用动态绑定控件的办法解决的。
也可以不动态绑定控件,但是如果那样的话,CheckedComboBoxEdit控件的下拉框的所有选项都是一样的。
而这里要求每一行的那个单元格下拉框值都不是一样的。
一、如何在Treelist \ Gridcontrol中绑定动态编辑控件
RepositoryItemCheckedComboBoxEdit checkedCBE; private void tlstSelLayer_CustomNodeCellEdit(object sender, DevExpress.XtraTreeList.GetCustomNodeCellEditEventArgs e) { if (e.Node == null) return; string fieldName = ""; string aliasName = ""; IFeatureClass featureClass; TreeListNode tln = e.Node; if (e.Column.Name == NodeNameDef.CONST_Alias && e.Node.Id >= 0) { checkedCBE = new RepositoryItemCheckedComboBoxEdit(); //checkedCBE.EditValueChanged += new System.EventHandler(checkedCBE_EditValueChanged); //checkedCBE.EditValueChanging += new ChangingEventHandler(checkedCBE_EditValueChanging); try { int length = 5; for (int i = 0; i < length; i++) { checkedCBE.Items.Add(i); //checkedCBE.Items.Add("真实值", "要显示的值"); } e.RepositoryItem = checkedCBE;//绑定控件 } catch (Exception) { } } }
二、如何获得编辑后的值
一般情况下,在Node中自动的会把数据同步过去。
但是,这个我使用的是中英文,显示的是中文,想得到对应的英文,绑定数据的时候也是这么做的。
//checkedCBE.Items.Add("真实值", "要显示的值"); “要显示的值”会自动同步到treelist/gridcontrol中,“真实值”怎么获得就困扰我了。花费了几天功夫,尝试了N中方法,终于知道了,是自己无知。CheckedComboBoxEdit的真实值、显示值会自动同步到node的真实值和显示值中,不需要实现如何获得真实值。
//treelist的node本身就具有显示值、真实值的区别 pNode.GetValue(0)//这是获得真实值 pNode.GetDisplayText(0)//这是获得显示值
三、我尝试的方法我在动态生成是绑定了一个方法,勾选值发生变化时触发一个事件,企图获得把获得的真实值赋值给treelist的node。
checkedCBE = new RepositoryItemCheckedComboBoxEdit(); //checkedCBE.EditValueChanged += new System.EventHandler(checkedCBE_EditValueChanged);
结果遇到了意外的问题:
在界面中勾选了值,已经显示处于选择状态了,在程序中去检查item状态,发现仍处于未选择状态。
非常不解。
private void cbeFields_EditValueChanged(object sender, EventArgs e) { if (tlstSelLayer.FocusedNode == null) return; string selectNames = ""; string selectAliass = ""; int length = checkedCBE.Items.Count; for (int i = 0; i < length; i++) { //即使列中的状态已经变化,勾选状态不会发生变化,即=CheckState.Unchecked if (checkedCBE.Items[i].CheckState == CheckState.Checked) { selectNames = selectNames + "," + cbeFields.Properties.Items[i].Value.ToString(); } } tlstSelLayer.FocusedNode[NodeNameDef.CONST_Fields] = selectNames; }
如下图:
已经勾选成功了
程序中仍然是未选择状态,非常不解!
ps.1 必须实现Iconvertible?
根据 DevExpress gridview下拉框repositoryItemComboBox的使用 这篇文章的提示,“gridview的单元格不答应,提示对象必须实现Iconvertible”,是不是这个原因?
ps.2 也可能是这个原因?
this.cmb_check_CKID.RefreshEditValue();//反绑定 的 时候 这句 很重要
--------------------------------------------------------------------------------------------
四、参考资料:
一下资料各有价值
GridControl填充复选框列表项 DevExpress gridview下拉框repositoryItemComboBox的使用 ComboBoxEdit 设置选项值(单选——多选) DevExpress中的lookupedit的使用方法详解 DevExpress:下拉框绑定数据源 (ComboBoxEdit,LookUpEdit) 关于DevExpress.XtraTreeList.TreeList控件的使用——给TreeList添加RepositoryItem以实现文本编辑功能 c#开发_Dev的关于XtraGrid的使用(GridControl小结)_Second时间: 2024-09-30 15:01:26