嘗試在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