DevExpress使用教程:Gridview下拉框

本人最近使用到 DevExpress Gridview下拉框repositoryItemComboBox控件,下面就詳細寫一下這個實現的過程,分享一下,同時也是對這個知識再次熟悉一遍。數據庫

DXperience Universal Suite下載微信

1、綁定前準備ide

這一部分基本上是一些基礎的知識,但也有些地方要注意的。ui

一、添加下拉框列this

在Grid Designer中,添加一列,在這列的ColumnEdit熟悉中,能夠選擇這列的編輯樣式,好比讓這列是一個按鈕或者選擇框等等,這裏咱們選擇下拉框,如圖:對象

DevExpress Gridview repositoryItemComboBox

這個下拉框默認被命名爲repositoryItemComboBox1,咱們對這列的操做,就是對repositoryItemComboBox1的操做。blog

二、爲gridview添加bindingSource事件

這裏要用bindingSource做爲數據源,這是爲了實 如今repositoryItemComboBox1選擇了一個值以後,gridview可以將它顯示,repositoryItemComboBox的 很大一個缺陷就是當你選擇一個值以後,不能像傳統gridview下拉框那樣,會讓他顯示在gridview中,並且當你鼠標點擊另一個單元格以後,就 會消失,變成空白或原來的數據。因此須要用bindingSource來綁定一個datatable,當repositoryItemComboBox1 選擇一個值以後,將值傳給datatable對應的列,當點擊另一個單元格或者其餘地方時,bindingSource會刷新綁定的 datatable。ci

2、綁定數據get

我在窗體加載的時候,調用了一個BindDataSource()的自定義方法,這個方法是實現爲repositoryItemComboBox1綁定選 擇值以及爲bindingSource綁定一個datatable 。BindDataSource()代碼以下:

private void BindDataSource()
        {
            //1.爲repositoryItemComboBox1綁定數據
            for (int i = 0; i < 3; i++)
            {
                CboItemEntity item = new CboItemEntity();
                item.Text = "這是" + i;
                item.Value = i;
                repositoryItemComboBox1.Items.Add(item);
            }
            //2.爲bindingSource綁定一個datatable
            dt = InitDt();
            bindingSource1.DataSource = dt;
        }

(1)在上述代碼1(1.爲repositoryItemComboBox1綁定數據)中,CboItemEntity 是一個實體類,代碼以下:

public class CboItemEntity
        {
            private object _text = 0;
            private object _Value = "";
            /// <summary>
            /// 顯示值
            /// </summary>
            public object Text
            {
                get { return this._text; }
                set { this._text = value; }
            }
            /// <summary>
            /// 對象值
            /// </summary>
            public object Value
            {
                get { return this._Value; }
                set { this._Value = value; }
            }

            public override string ToString()
            {
                return this.Text.ToString();
            }
        }

(2)在代碼2(2.爲bindingSource綁定一個datatable)中,dt是一個全局變量,InitDt()是一個自定義的建立一張datatable的方法,實際工做中,能夠是從數據庫中獲取一張表等,我這裏就以我建立的表爲例,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號", "看書", -52.874, "2011-8-5 17:52:55", "###", 0, "這是0" });
            dt.Rows.Add(new object[] { 0, 6, "張三", 1, "東大街6號", "看書", -52.874, "2011-8-5 17:52:55", "###", 1, "這是1" });
            dt.Rows.Add(new object[] { 0, 11, "張三", 1, "東大街6號", "看書", -52.874, "2011-8-5 17:52:55", "###", 2, "這是2" });return dt;
        }

這裏只須要注意最後兩列就好了,value列是用來保存下拉框的實際值,text列是保存下拉框的選擇值。

3、repositoryItemComboBox的處理

完成上述的內容,當咱們運行程序的時候,會發現,datagridview顯示datatable中的值,下拉框有咱們綁定的數據,可是當我在下拉框中選 擇一個值離開後,gridview不會顯示咱們選中的值,而是回到原值。咱們就要想辦法讓咱們選中一個值時,保存到datatable中,這樣當咱們離開 後,bindingSource天然會刷新gridview,以達到顯示選中值的效果。

(1)那麼如何實現將選中的值保存到datatable,由於咱們的bindingSource綁定的是一個全局的datatable,因此只要獲取到選 中值,很容易就能給datatable賦值,到這裏容易被難住,由於咱們不能像對待其餘控件同樣,在他的屬性中找到他的某某事件,雙擊進入代碼編寫,咱們 找不到查看repositoryItemComboBox1的屬性界面。那就另尋道路,利用委託,因而,咱們在以前的BindDataSource()方法中,加入一個委託方法,BindDataSource()代碼變爲:

private void BindDataSource()
        {
            //1.爲repositoryItemComboBox1綁定數據
            for (int i = 0; i < 3; i++)
            {
                CboItemEntity item = new CboItemEntity();
                item.Text = "這是" + i;
                item.Value = i;
                repositoryItemComboBox1.Items.Add(item);
            }
            //2.爲bindingSource綁定一個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)完成到這裏,先不要急着運行,由於當運行的時候,又會有一個新的問題,選中的值會保存到datatable,可是gridview的單元格不答應,提示對象必須實現Iconvertible:

DevExpress gridview

解決辦法是,繼續在BindDataSource()中添加一個委託方法解決它,BindDataSource()代碼變爲:

private void BindDataSource()
        {
            //1.爲repositoryItemComboBox1綁定數據
            for (int i = 0; i < 3; i++)
            {
                CboItemEntity item = new CboItemEntity();
                item.Text = "這是" + i;
                item.Value = i;
                repositoryItemComboBox1.Items.Add(item);
            }
            //2.爲bindingSource綁定一個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;
        }

到這裏,就已所有完成咯,效果圖:

DevExpress Gridview

 

DevExpress Gridview

Via博客園i小白

===============================================================

更多精彩預告請持續關注DevExpress中文網! 掃描關注DevExpress中文網微信公衆號,及時獲取最新動態及最新資訊

DevExpress中文網微信

相關文章
相關標籤/搜索