• <menu id="w2i4a"></menu>
  • logo DevExpress使用教程

    文檔首頁>>DevExpress使用教程>>DevExpress使用教程:Gridview下拉框

    DevExpress使用教程:Gridview下拉框


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

    DXperience Universal Suite下載

    一、綁定前準(zhǔn)備

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

    1、添加下拉框列

    在Grid Designer中,添加一列,在這列的ColumnEdit熟悉中,可以選擇這列的編輯樣式,比如讓這列是一個按鈕或者選擇框等等,這里我們選擇下拉框,如圖:

    DevExpress Gridview repositoryItemComboBox

    這個下拉框默認(rèn)被命名為repositoryItemComboBox1,我們對這列的操作,就是對repositoryItemComboBox1的操作。

    2、為gridview添加bindingSource

    這里要用bindingSource作為數(shù)據(jù)源,這是為了實 現(xiàn)在repositoryItemComboBox1選擇了一個值之后,gridview能夠?qū)⑺@示,repositoryItemComboBox的 很大一個缺陷就是當(dāng)你選擇一個值之后,不能像傳統(tǒng)gridview下拉框那樣,會讓他顯示在gridview中,而且當(dāng)你鼠標(biāo)點擊另外一個單元格之后,就 會消失,變成空白或原來的數(shù)據(jù)。所以需要用bindingSource來綁定一個datatable,當(dāng)repositoryItemComboBox1 選擇一個值之后,將值傳給datatable對應(yīng)的列,當(dāng)點擊另外一個單元格或者其他地方時,bindingSource會刷新綁定的 datatable。

    二、綁定數(shù)據(jù)

    我在窗體加載的時候,調(diào)用了一個BindDataSource()的自定義方法,這個方法是實現(xiàn)為repositoryItemComboBox1綁定選 擇值以及為bindingSource綁定一個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綁定一個datatable
                dt = InitDt();
                bindingSource1.DataSource = dt;
            }

    (1)在上述代碼1(1.為repositoryItemComboBox1綁定數(shù)據(jù))中,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()是一個自定義的創(chuàng)建一張datatable的方法,實際工作中,可以是從數(shù)據(jù)庫中獲取一張表等,我這里就以我創(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號", "看書", -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列是保存下拉框的選擇值。

    三、repositoryItemComboBox的處理

    完成上述的內(nèi)容,當(dāng)我們運(yùn)行程序的時候,會發(fā)現(xiàn),datagridview顯示datatable中的值,下拉框有我們綁定的數(shù)據(jù),但是當(dāng)我在下拉框中選 擇一個值離開后,gridview不會顯示我們選中的值,而是回到原值。我們就要想辦法讓我們選中一個值時,保存到datatable中,這樣當(dāng)我們離開 后,bindingSource自然會刷新gridview,以達(dá)到顯示選中值的效果。

    (1)那么如何實現(xiàn)將選中的值保存到datatable,因為我們的bindingSource綁定的是一個全局的datatable,所以只要獲取到選 中值,很容易就能給datatable賦值,到這里容易被難住,因為我們不能像對待其他控件一樣,在他的屬性中找到他的某某事件,雙擊進(jìn)入代碼編寫,我們 找不到查看repositoryItemComboBox1的屬性界面。那就另尋道路,利用委托,于是,我們在之前的BindDataSource()方法中,加入一個委托方法,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綁定一個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)行,因為當(dāng)運(yùn)行的時候,又會有一個新的問題,選中的值會保存到datatable,但是gridview的單元格不答應(yīng),提示對象必須實現(xiàn)Iconvertible:

    DevExpress gridview

    解決辦法是,繼續(xù)在BindDataSource()中添加一個委托方法解決它,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綁定一個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小白

    掃碼咨詢


    添加微信 立即咨詢

    電話咨詢

    客服熱線
    023-68661681

    TOP
    三级成人熟女影院,欧美午夜成人精品视频,亚洲国产成人乱色在线观看,色中色成人论坛 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();