DevExpress控件開發常用要點


 1、 GridControl控件的數據顯示的樣式控制

如上兩圖所示,我們有時候需要控制列表訪問過的顏色變化,或者是時間顯示格式等內容,這個時候設置GridView的RowCellStyle即可實現,如下所示。

this.gridView1.RowCellStyle += new DevExpress.XtraGrid.Views.Grid.RowCellStyleEventHandler(gridView1_RowCellStyle);
復制代碼
        void gridView1_RowCellStyle(object sender, DevExpress.XtraGrid.Views.Grid.RowCellStyleEventArgs e) { if (e.Column.FieldName == "PublishType") { if (e.CellValue != null && e.CellValue.ToString() == "中介") { e.Appearance.BackColor = Color.DeepSkyBlue; e.Appearance.BackColor2 = Color.LightCyan; } } if (e.Column.FieldName == "PublishTime") { e.Column.DisplayFormat.FormatString = "yyyy-MM-dd HH:mm:ss"; } if (e.Column.FieldName == "Title") { string id = this.winGridViewPager1.gridView1.GetRowCellDisplayText(e.RowHandle, "Id"); if (historyDict.ContainsKey(id)) { e.Appearance.BackColor = Color.DeepSkyBlue; e.Appearance.BackColor2 = Color.LightCyan; } } }
復制代碼

 

2、在LayoutControl布局中固定控件寬度

固定寬度后的真實效果。

為了使得界面統一性及更好的控制性,我們一般使用LayoutControl布局控件作為我們添加控件的布局容器,但是這個控件默認是對其中的控件進行按窗口比例進行縮放的,有些客戶就不喜歡這些特點,因為他們的顯示器可能是30寸的(誇張一點點,不過很多寬屏的),這樣很多輸入框就會被拉得很長,這樣小小一個輸入框,可能有很長的一段空白的距離,那樣可能真的不好看,如下圖所示。

設置固定寬度,其實不是很麻煩,需要設置幾個屬性即可

1) 設置控件的SizeConstraintsType為DevExpress.XtraLayout.SizeConstraintsType.Custom;

2)設置控件的FillControlToClientArea 為False

3)設置控件的ControlMaxSize的大小(必要時也可以設置ControlMinSize),設置例子如下所示。

 

3、GridControl中的GridView內容打印

由於GridView的良好封裝性,實現打印的代碼很簡單。

復制代碼
        private void menu_Print_Click(object sender, EventArgs e) { PrintableComponentLink link = new PrintableComponentLink(new PrintingSystem()); link.Component = this.gridControl1; link.Landscape = true; link.PaperKind = System.Drawing.Printing.PaperKind.A3; link.CreateMarginalHeaderArea += new CreateAreaEventHandler(Link_CreateMarginalHeaderArea); link.CreateDocument(); link.ShowPreview(); } private void Link_CreateMarginalHeaderArea(object sender, CreateAreaEventArgs e) { string title = string.Format("年度大體檢-({0}年度)", this.txtYear.Text); PageInfoBrick brick = e.Graph.DrawPageInfo(PageInfo.None, title, Color.DarkBlue, new RectangleF(0, 0, 100, 21), BorderSide.None); brick.LineAlignment = BrickAlignment.Center; brick.Alignment = BrickAlignment.Center; brick.AutoWidth = true; brick.Font = new System.Drawing.Font("宋體", 11f, FontStyle.Bold); }
復制代碼

 

4、設置GridView的行指示器(行頭)顯示行號

 

在我的分頁控件以及Winform開發框架很多項目介紹里面,很多都顯示了行號,其實這個在DevExpress中的實現很簡單,如果需要,可以實現在自己的代碼里面。

1) 先實現GridView的CustomDrawRowIndicator事件,實現代碼如下所示。

復制代碼
        private void advBandedGridView1_CustomDrawRowIndicator(object sender, DevExpress.XtraGrid.Views.Grid.RowIndicatorCustomDrawEventArgs e) { e.Appearance.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Far; if (e.Info.IsRowIndicator) { if (e.RowHandle >= 0) { e.Info.DisplayText = (e.RowHandle + 1).ToString(); } else if (e.RowHandle < 0 && e.RowHandle > -1000) { e.Info.Appearance.BackColor = System.Drawing.Color.AntiqueWhite; e.Info.DisplayText = "G" + e.RowHandle.ToString(); } } }
復制代碼

2)然后設置GridView控件的IndicatorWidth為合適的寬度,如40左右則比較好。

這樣設置后,就能順利顯示行號了,是不是很方便呢。

 

5、GridView表頭多行顯示(折行),表頭及行內容居中操作

在一些自定義的列表中,我們為了合理顯示表頭的內容,可能會要求表頭顯示的文字可以折行顯示,然后還需要內容居中顯示,那么在DevExpress該如何操作呢,代碼設置如下所示。

復制代碼
            //表頭折行設置 this.gridView1.ColumnPanelRowHeight = 40; this.gridView1.OptionsView.AllowHtmlDrawHeaders = true; this.gridView1.Appearance.HeaderPanel.TextOptions.WordWrap = DevExpress.Utils.WordWrap.Wrap; //表頭及行內容居中顯示 this.gridView1.Appearance.Row.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center; this.gridView1.Appearance.HeaderPanel.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
復制代碼

然后設置表頭的時候,設置內容使用\r\n來進行換行,如:體重\r\n(kg)

下面是我分頁控件里面的例子設置,供參考。

復制代碼
            this.winGridViewPager1.AddColumnAlias("Weight", "體重\r\n(kg)"); this.winGridViewPager1.AddColumnAlias("Pulse", "脈搏\r\n(次)"); this.winGridViewPager1.AddColumnAlias("BloodSystolic", "收縮壓"); this.winGridViewPager1.AddColumnAlias("BloodDiastolic", "舒張壓"); this.winGridViewPager1.AddColumnAlias("SightLeft", "視力\r\n(左)"); this.winGridViewPager1.AddColumnAlias("SightRight", "視力\r\n(右)");
復制代碼

 

6、控件內容輸入問題

 在客戶使用軟件的時候,反饋說有一些數字輸入框、日期輸入框,不支持鍵盤輸入內容,經測試,確實是存在這個問題,默認的數字、日期等輸入,都要切換輸入法才可以輸入,不能默認就支持數字的輸入,那么是否有辦法解決呢,當然辦法總是有的。

其實只需要設置 ImeMode=Off 即可解決問題,關於這個屬性,大家可以參考下面的介紹。(就開發而言,記得逢數字,日期的控件,必須設置 ImeMode=Off ,否則你的軟件使用客戶會罵娘。

ImeMode 枚舉:指定一個值,該值是用來確定在選定了對象時該對象的輸入法編輯器 (IME) 的狀態。 以下是微軟的解釋:        

成員名稱 說明
Alpha 字母數字單字節字符 (SBC)。此設置僅對朝鮮語和日語 IME 有效。
AlphaFull 字母數字雙字節字符。此設置僅對朝鮮語和日語 IME 有效。
Close Disable IME 被禁用。如果使用此設置,則用戶無法從鍵盤打開 IME,而且 IME 浮動窗口處於隱藏狀態。
Hangul 朝鮮文 SBC。此設置僅對朝鮮語 IME 有效。
HangulFull 朝鮮文 DBC。此設置僅對朝鮮語 IME 有效。
Hiragana 平假名 DBC。此設置僅對日語 IME 有效。
Inherit 繼承父控件的 IME 模式。
Katakana 片假名 DBC。此設置僅對日語 IME 有效。
KatakanaHalf 片假名 SBC。此設置僅對日語 IME 有效。
NoControl 無(默認)。
Off IME 已關閉。此模式指示 IME 已關閉,這意味着該對象的行為方式與英語輸入模式相同。 此設置僅對日語、簡體中文和繁體中文 IME 有效。
On IME 已打開。此值指示 IME 已打開,可以輸入中文或日語特定的字符。此設置僅對日語、簡體中文和繁體中文 IME 有效。

 

 7、多行表頭的實現

有時候,我們為了一些特殊的需要,要對表頭進行特別的排版,使其支持多行表頭的效果,如上圖所示,這樣方便對各項內容進行歸類顯示,易於閱讀,在DevExpress中應該如何實現這個效果呢?

1)先在設計模式將普通的GridView轉換為BandedGridView或者AdvBandedGridView,這樣才能支持這種多行表頭的做法,如下所示。

2)定義一些字段,用來顯示其中的內容,如下圖所示。

3)定義一些Band列,設置相關的屬性,並把設計界面中的字段列表拖動到對應過的Band列上面,這樣就構成了一個Band列和字段內容的對應關系。

完成上面的綁定關系后,記得設置GridView控件的屬性,使其不要顯示原本的ColumnHeader等內容。

設置好這些內容,才能合理、完美顯示出多行表頭的信息。

 

 8. 在GridControl控件中使用SearchLookUpEdit構建數據快速輸入

1、 GridControl集成SearchLookUpEdit的效果展現

首先我們來介紹一下整個效果圖,以便有感性的印象。

1)啟動后默認效果

2)彈出窗體效果

3)選中數據后效果圖

其實上面是一個測試的例子,具體的應用會比較復雜一點,不過操作過程差不多,我們都是在一個Cell里面嵌入一個可以選擇(包括查詢)的數據列表,從中選擇我們需要的內容,然后可以在另外一個Cell中輸入一些其他的信息,保存的時候,一並保存即可。

2、GridControl集成SearchLookUpEdit的實現過程

在開始介紹之前,我們要清楚,這個GridControl必須先綁定數據源(數據源可以為空),如果不綁定數據源,那么雖然可以彈出列表供選擇,但是鼠標移開值就會丟失的問題,一開始不明白其中道理,搞了很久。

首先要為GridControl添加兩個字段,設置好他們的顯示Caption和FieldName即可,然后在我們需要彈出窗口的單元格對象中,選擇它的ColumnEdit控件為SearchLookup控件即可,如下所示。

這個時候,它會生成一個repositoryItemSearchLookUpEdit1的控件,這個控件就是該單元格的內嵌編輯控件了,可以從中選擇列表的值,我們設置這個列表的DisplayMember為Name(顯示的字段內容),ValueMember為ID(保存的值字段),如下所示。

除了你要設置主窗體里面的GridControl運行添加列外,你還需要設置編輯控件里面的View中OpitonsView里面的NewItemRowPosition為Botton(默認為None),這一步很重要,否則無法出現一個新建的行給你錄入數據的。

例子代碼比較簡單,主要是為了演示這種方式的使用,代碼如下所示

        DataTable dt = new DataTable(); private void Form1_Load(object sender, EventArgs e) { dt.Columns.Add("ID"); dt.Columns.Add("Name"); for (int i = 0; i < 100; i++) { DataRow row = dt.NewRow(); row["ID"] = i.ToString(); row["Name"] = (new Random()).NextDouble().ToString(); dt.Rows.Add(row); System.Threading.Thread.Sleep(1); } this.repositoryItemSearchLookUpEdit1.DataSource = dt; this.gridControl1.DataSource = dt.Clone(); } private void gridView1_CellValueChanged(object sender, DevExpress.XtraGrid.Views.Base.CellValueChangedEventArgs e) { if (e.Column.FieldName == "ID") { string id = e.Value.ToString(); DataRow[] dr = dt.Select(string.Format("ID = '{0}'", id)); if(dr != null && dr.Length > 0) { DataRow row = dr[0]; string name = row["Name"].ToString(); gridView1.SetRowCellValue(e.RowHandle, "Name", name); } } }

3、 GridControl集成SearchLookUpEdit的實際案例操作

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

在實際應用中,我們在編輯一些歷史數據的時候,不希望原來的記錄被修改,但是可以增加新的記錄,但是前面所有介紹的內容,沒有能夠解決這個問題,那么我們應該如何操作才能實現這個效果呢?

其實GridView對象里面有一個ShowingEditor的事件,用來判斷是否顯示單元格的編輯器的,這樣我們對數據庫已有記錄進行控制,不讓它在列表中顯示編輯控件出來即可,具體代碼如下所示。

        this.gridView1.ShowingEditor += new CancelEventHandler(gridView1_ShowingEditor);//實際使用的代碼 void gridView1_ShowingEditor(object sender, CancelEventArgs e) { object ID = this.gridView1.GetRowCellValue(this.gridView1.FocusedRowHandle, "ID"); if (ID != null && !string.IsNullOrEmpty(ID.ToString())) { e.Cancel = true; } }

在保持數據的時候,我們對歷史數據就不用修改保持,只需要針對新增的內容即可,如何做到的呢?其實就是判定他的綁定值是否存在即可,如果有綁定值,那么就是歷史的數據,沒有就是新的,進行特殊操作即可,如下代碼所示。

            if (this.gridView1.RowCount > 0) { #region 提交用葯記錄明細 for (int i = 0; i < this.gridView1.RowCount; i++) { //根據ID來判斷是否新增的用葯記錄 object ID = this.gridView1.GetRowCellValue(i, "ID"); if (ID == null || string.IsNullOrEmpty(ID.ToString())) { //.........................  } } #endregion }


免責聲明!

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



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