在Winform開發框架中,利用DevExpress控件實現數據的快速錄入和選擇


在實際的項目開發過程中,有好的控件或者功能模塊,我都是想辦法盡可能集成到我的WInform開發框架中,這樣后面開發項目起來,就可以節省很多研究時間,並能重復使用,非常高效方便。在我很早之前的一篇博客《在GridControl控件中使用SearchLookUpEdit構建數據快速輸入》就曾經介紹,如何在列表控件中實現數據的快速錄入,本文介紹另外一種方式,通過文本輸入框的輸入選擇,可以實現數據的快速錄入,原理和之前一篇差不多,不過這次利用DevExpress控件的GridLookupEdit控件封裝類進行數據的處理。

1、GridControl集成SearchLookUpEdit的效果展現

首先我們來回顧一下,GridControl列表控件中如何實現數據的快速錄入的。一般情況下,在我的框架都是利用彈出窗體進行標准數據的錄入,這樣的情況比較通用,但是對於一些想實現數據在列表中快速錄入,可能就不一定符合他們的使用習慣,客戶要求往往是第一位,如果有這樣的要求,我們一定要想辦法滿足。

一個實際的案例就是門診的時候,醫生用葯的情況,除了選擇其他內容外,主要的就是快速錄入葯品信息。我們平常去大一點 的醫院看病,好像看到的多數操作都是這樣。還有一種方式就是銷售人員提供的報價單,從產品里面選擇信息,然后修改下價格,這些場景都是很適合這樣的操作的。下面是一個門診的例子。

2、在文本輸入控件中實現數據的快速錄入或選擇

1)原有系統控件實現的界面效果

很多時候,我們可能需要在編輯框里面快速錄入數據,如果是純粹的選擇列表項目,那么可以選擇GridLookupEdit或者SearchLookupEdit控件,這兩個控件都是可以實現快速的選擇的,如下DevExpress例子的界面所示。

GridLookupEdit例子效果:

SearchLookupEdit例子效果:

2)Winform開發框架中封裝的GridLookupEdit控件的輸入效果

上面兩個不同的例子,他們彈出一個新的列表框操作都差不多的,不同的是SearchLookupEdit控件會有一個可以查找的輸入框,實現數據的過濾查找。

使用GridLookupEdit控件,可以把輸入框的屬性TextEditStyle修改為修改為TextEditStyles.Standard,如果要封裝用來可以允許輸入新的內容,記得要處理ProcessNewValue函數,默認GridLookupEdit控件不允許輸入列表中不存在的內容,也就是只能選擇列表的內容。

但是,我們項目很多時候,需要一個可以錄入,也可以從列表中選擇數據的場景,最好能夠結合拼音碼實現數據的快速錄入,如下界面所示。

當我們輸入中文的時候,會自動從列表中進行數據的過濾,如下所示。

當我們輸入拼音簡碼的時候,也可以實現一樣的效果,如下所示。

當然,如果列表里面沒有相應的數據的時候,我們可以輸入新的內容(注意:默認的GridLookupEdit是不允許輸入新內容的

這樣在內容很多的時候,就可以實現數據的快速選擇或者錄入新的數據了。

例如我的《醫院科室數據管理系統》軟件產品里面,就需要從大量的入院診斷或者出院診斷中選擇或者輸入新的診斷,上面的控件效果就是我所需要的。

當然,以上只是框架功能模塊的滄海一栗,很多重要的功能並不在該文中介紹,具體可以了解這個框架設計圖,或者查看《 Winform開發框架的標簽內容

Winform開發框架的主要功能概覽如下圖所示。

3、在文本輸入控件中實現數據的快速錄入的代碼實現

這個功能模塊的重要實現就是要重新封裝GridLookupEdit控件,並設置其一些默認屬性,還需要處理前面所說過的,處理該對象的ProcessNewValue的事件處理,部分代碼如下所示。

    /// <summary>
    /// 自定義的GridLookUpEdit控件
    /// </summary>
    public class CustomGridLookUpEdit : GridLookUpEdit
    {
        /// <summary>
        /// 是否禁止新增內容
        /// </summary>
        [Browsable(true), Description("是否禁止新增內容")]
        public bool DisableAddNew { get; set; }

        static CustomGridLookUpEdit()
        {
            RepositoryItemCustomGridLookUpEdit.RegisterCustomGridLookUpEdit();
        }

        public CustomGridLookUpEdit() : base() 
        {
            //初始化一些狀態
            this.Properties.PopupFilterMode = PopupFilterMode.Contains;//包含即可
            this.Properties.ImmediatePopup = true;//是否馬上彈出窗體
            this.Properties.ValidateOnEnterKey = true;//回車確認
            this.Properties.TextEditStyle = DevExpress.XtraEditors.Controls.TextEditStyles.Standard;//文本框可輸入
            this.Properties.NullText = "";
            this.Properties.NullValuePrompt = "";
            
            this.ProcessNewValue += new DevExpress.XtraEditors.Controls.ProcessNewValueEventHandler(CustomGridLookUpEdit_ProcessNewValue);            
        }
        
        /// <summary>
        /// 實現在列表沒有記錄的時候,可以錄入一個不存在的記錄,類似ComoboEidt功能
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void CustomGridLookUpEdit_ProcessNewValue(object sender, DevExpress.XtraEditors.Controls.ProcessNewValueEventArgs e)
        {
            if (!DisableAddNew && !this.DesignMode)
            {
                string displayName = this.Properties.DisplayMember;
                string valueName = this.Properties.ValueMember;
                string display = e.DisplayValue.ToString();

                DataTable dtTemp = this.Properties.DataSource as DataTable;
                if (dtTemp != null)
                {
                    DataRow[] selectedRows = dtTemp.Select(string.Format("{0}='{1}'", displayName, display.Replace("'", "")));
                    if (selectedRows == null || selectedRows.Length == 0)
                    {
                        DataRow row = dtTemp.NewRow();
                        row[displayName] = display;
                        row[valueName] = display;
                        dtTemp.Rows.Add(row);
                        dtTemp.AcceptChanges();
                    }
                }

                e.Handled = true;
            }
        }

在調用的時候,我們需要綁定相應的數據,並且給它增加一個拼音碼的列,方便通過拼音碼來實現快速檢索,使用代碼如下所示(這里通過擴展方法的方式實現數據的綁定)。

        /// <summary>
        /// 綁定下拉列表控件為指定的數據字典列表
        /// </summary>
        /// <param name="combo">下拉列表控件</param>
        /// <param name="dictTypeName">數據字典類型名稱</param>
        /// <param name="defaultValue">控件默認值</param>
        public static void BindDictItems(this CustomGridLookUpEdit combo, string dictTypeName, string defaultValue)
        {
            string displayName = dictTypeName;
            const string valueName = "值內容";
            const string pinyin = "拼音碼";
            DataTable dt = DataTableHelper.CreateTable(string.Format("{0},{1},{2}", displayName, valueName, pinyin));

            Dictionary<string, string> dict = BLLFactory<DictData>.Instance.GetDictByDictType(dictTypeName);
            foreach (string key in dict.Keys)
            {
                DataRow row = dt.NewRow();
                row[displayName] = key;
                row[valueName] = dict[key];
                row[pinyin] = Pinyin.GetFirstPY(key);
                dt.Rows.Add(row);
            }

            combo.Properties.ValueMember = valueName;
            combo.Properties.DisplayMember = displayName;
            combo.Properties.DataSource = dt;
            combo.Properties.PopulateViewColumns();
            combo.Properties.View.Columns[valueName].Visible = false;
            combo.Properties.View.Columns[displayName].Width = 400;
            combo.Properties.View.Columns[pinyin].Width = 200;
            combo.Properties.PopupFormMinSize = new System.Drawing.Size(600, 0);

            if (!string.IsNullOrEmpty(defaultValue))
            {
                combo.EditValue = defaultValue;
            }
        }

調用代碼只需要調用該方法即可。

txtInDiagnosis.BindDictItems("入院診斷");

以上就是我對於這種利用DevExpress控件實現數據的快速錄入和選擇操作的功能演示和實際代碼邏輯展示,希望對大家有所幫助。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM