轉(zhuǎn)帖|使用教程|編輯:我只采一朵|2014-10-11 09:45:33.000|閱讀 18102 次
概述:本文分享了 DevExpress Gridview下拉框repositoryItemComboBox控件的實(shí)現(xiàn)過程。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
本人最近使用到 DevExpress Gridview下拉框repositoryItemComboBox控件,下面就詳細(xì)寫一下這個(gè)實(shí)現(xiàn)的過程,分享一下,同時(shí)也是對(duì)這個(gè)知識(shí)再次熟悉一遍。
【DXperience Universal Suite下載】
一、綁定前準(zhǔn)備
這一部分基本上是一些基礎(chǔ)的知識(shí),但也有些地方要注意的。
1、添加下拉框列
在Grid Designer中,添加一列,在這列的ColumnEdit熟悉中,可以選擇這列的編輯樣式,比如讓這列是一個(gè)按鈕或者選擇框等等,這里我們選擇下拉框,如圖:
這個(gè)下拉框默認(rèn)被命名為repositoryItemComboBox1,我們對(duì)這列的操作,就是對(duì)repositoryItemComboBox1的操作。
2、為gridview添加bindingSource
這里要用bindingSource作為數(shù)據(jù)源,這是為了實(shí) 現(xiàn)在repositoryItemComboBox1選擇了一個(gè)值之后,gridview能夠?qū)⑺@示,repositoryItemComboBox的 很大一個(gè)缺陷就是當(dāng)你選擇一個(gè)值之后,不能像傳統(tǒng)gridview下拉框那樣,會(huì)讓他顯示在gridview中,而且當(dāng)你鼠標(biāo)點(diǎn)擊另外一個(gè)單元格之后,就 會(huì)消失,變成空白或原來的數(shù)據(jù)。所以需要用bindingSource來綁定一個(gè)datatable,當(dāng)repositoryItemComboBox1 選擇一個(gè)值之后,將值傳給datatable對(duì)應(yīng)的列,當(dāng)點(diǎn)擊另外一個(gè)單元格或者其他地方時(shí),bindingSource會(huì)刷新綁定的 datatable。
二、綁定數(shù)據(jù)
我在窗體加載的時(shí)候,調(diào)用了一個(gè)BindDataSource()的自定義方法,這個(gè)方法是實(shí)現(xiàn)為repositoryItemComboBox1綁定選 擇值以及為bindingSource綁定一個(gè)datatable 。BindDataSource()代碼如下:
private void BindDataSource() { //1.為repositoryItemComboBox1綁定數(shù)據(jù) for (int i = 0; i < 3; i++) { CboItemEntity item = new CboItemEntity(); item.Text = "這是" + i; item.Value = i; repositoryItemComboBox1.Items.Add(item); } //2.為bindingSource綁定一個(gè)datatable dt = InitDt(); bindingSource1.DataSource = dt; }
(1)在上述代碼1(1.為repositoryItemComboBox1綁定數(shù)據(jù))中,CboItemEntity 是一個(gè)實(shí)體類,代碼如下:
public class CboItemEntity { private object _text = 0; private object _Value = ""; /// <summary> /// 顯示值 /// </summary> public object Text { get { return this._text; } set { this._text = value; } } /// <summary> /// 對(duì)象值 /// </summary> public object Value { get { return this._Value; } set { this._Value = value; } } public override string ToString() { return this.Text.ToString(); } }
(2)在代碼2(2.為bindingSource綁定一個(gè)datatable)中,dt是一個(gè)全局變量,InitDt()是一個(gè)自定義的創(chuàng)建一張datatable的方法,實(shí)際工作中,可以是從數(shù)據(jù)庫(kù)中獲取一張表等,我這里就以我創(chuàng)建的表為例,InitDt()代碼如下:
private DataTable InitDt() { dt.Columns.Add("check", typeof(bool)); dt.Columns.Add("id", typeof(int)); dt.Columns.Add("name", typeof(string)); dt.Columns.Add("sex", typeof(int)); dt.Columns.Add("address", typeof(string)); dt.Columns.Add("aihao", typeof(string)); dt.Columns.Add("shuju", typeof(decimal)); dt.Columns.Add("time", typeof(DateTime)); dt.Columns.Add("zidingyi", typeof(string)); dt.Columns.Add("value", typeof(int)); dt.Columns.Add("text", typeof(string)); dt.Rows.Add(new object[] { 0, 1, "張三", 1, "東大街6號(hào)", "看書", -52.874, "2011-8-5 17:52:55", "###", 0, "這是0" }); dt.Rows.Add(new object[] { 0, 6, "張三", 1, "東大街6號(hào)", "看書", -52.874, "2011-8-5 17:52:55", "###", 1, "這是1" }); dt.Rows.Add(new object[] { 0, 11, "張三", 1, "東大街6號(hào)", "看書", -52.874, "2011-8-5 17:52:55", "###", 2, "這是2" });return dt; }
這里只需要注意最后兩列就行了,value列是用來保存下拉框的實(shí)際值,text列是保存下拉框的選擇值。
三、repositoryItemComboBox的處理
完成上述的內(nèi)容,當(dāng)我們運(yùn)行程序的時(shí)候,會(huì)發(fā)現(xiàn),datagridview顯示datatable中的值,下拉框有我們綁定的數(shù)據(jù),但是當(dāng)我在下拉框中選 擇一個(gè)值離開后,gridview不會(huì)顯示我們選中的值,而是回到原值。我們就要想辦法讓我們選中一個(gè)值時(shí),保存到datatable中,這樣當(dāng)我們離開 后,bindingSource自然會(huì)刷新gridview,以達(dá)到顯示選中值的效果。
(1)那么如何實(shí)現(xiàn)將選中的值保存到datatable,因?yàn)槲覀兊腷indingSource綁定的是一個(gè)全局的datatable,所以只要獲取到選 中值,很容易就能給datatable賦值,到這里容易被難住,因?yàn)槲覀儾荒芟駥?duì)待其他控件一樣,在他的屬性中找到他的某某事件,雙擊進(jìn)入代碼編寫,我們 找不到查看repositoryItemComboBox1的屬性界面。那就另尋道路,利用委托,于是,我們?cè)谥暗腂indDataSource()方法中,加入一個(gè)委托方法,BindDataSource()代碼變?yōu)椋?/p>
private void BindDataSource() { //1.為repositoryItemComboBox1綁定數(shù)據(jù) for (int i = 0; i < 3; i++) { CboItemEntity item = new CboItemEntity(); item.Text = "這是" + i; item.Value = i; repositoryItemComboBox1.Items.Add(item); } //2.為bindingSource綁定一個(gè)datatable dt = InitDt(); bindingSource1.DataSource = dt; //3.下拉框選中值改變事件 repositoryItemComboBox1.SelectedIndexChanged += new EventHandler(ComboBoxEdit_SelectedIndexChanged); }
上述代碼3(3.下拉框選中值改變事件)中,ComboBoxEdit_SelectedIndexChanged的代碼如下:
void ComboBoxEdit_SelectedIndexChanged(object sender, EventArgs e) { CboItemEntity item = new CboItemEntity(); try { //1.獲取下拉框選中值 item = (CboItemEntity)(sender as ComboBoxEdit).SelectedItem; string text = item.Text.ToString(); int value =(int)item.Value; //2.獲取gridview選中的行 GridView myView=(gridControl1.MainView as GridView); int dataIndex = myView.GetDataSourceRowIndex(myView.FocusedRowHandle); //3.保存選中值到datatable dt.Rows[dataIndex]["value"] = value; dt.Rows[dataIndex]["text"] = text; } catch (Exception ex) { XtraMessageBox.Show(ex.Message, "提示"); } }
(2)完成到這里,先不要急著運(yùn)行,因?yàn)楫?dāng)運(yùn)行的時(shí)候,又會(huì)有一個(gè)新的問題,選中的值會(huì)保存到datatable,但是gridview的單元格不答應(yīng),提示對(duì)象必須實(shí)現(xiàn)Iconvertible:
解決辦法是,繼續(xù)在BindDataSource()中添加一個(gè)委托方法解決它,BindDataSource()代碼變?yōu)椋?/p>
private void BindDataSource() { //1.為repositoryItemComboBox1綁定數(shù)據(jù) for (int i = 0; i < 3; i++) { CboItemEntity item = new CboItemEntity(); item.Text = "這是" + i; item.Value = i; repositoryItemComboBox1.Items.Add(item); } //2.為bindingSource綁定一個(gè)datatable dt = InitDt(); bindingSource1.DataSource = dt; //3.下拉框選中值改變事件 repositoryItemComboBox1.SelectedIndexChanged += new EventHandler(ComboBoxEdit_SelectedIndexChanged); //4.解決IConvertible問題 repositoryItemComboBox1.ParseEditValue += new ConvertEditValueEventHandler(repositoryItemComboBox1_ParseEditValue); }
在上述代碼4(4.解決IConvertible問題)中,repositoryItemComboBox1_ParseEditValue的代碼如下:
void repositoryItemComboBox1_ParseEditValue(object sender, ConvertEditValueEventArgs e) { e.Value = e.Value.ToString(); e.Handled = true; }
到這里,就已全部完成咯,效果圖:
Via博客園i小白
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn