原創(chuàng)|其它|編輯:郝浩|2012-10-11 13:55:46.000|閱讀 4824 次
概述:關(guān)于數(shù)據(jù)綁定:明細部分數(shù)據(jù)賦值的時候不需要象MultilRow那樣逐行賦值,它只需要綁定數(shù)據(jù)集就可以了,在DataSet里需要對應(yīng)字段名,這樣在SetRowCellValue或者GetRowCellValue里指定的Columns[“xx”]才能設(shè)置或取到正確的數(shù)據(jù)
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
關(guān)于數(shù)據(jù)綁定:明細部分數(shù)據(jù)賦值的時候不需要象MultilRow那樣逐行賦值,它只需要綁定數(shù)據(jù)集就可以了,在DataSet里需要對應(yīng)字段名,這樣在SetRowCellValue或者GetRowCellValue里指定的Columns[“xx”]才能設(shè)置或取到正確的數(shù)據(jù)
在SetRequestData里用記錄集收集數(shù)據(jù),而不需要象MultilRow取明細中的值,要注意的是在行離開的時候最好用到View的UpdateCurrentRow方法用語更新記錄集
在GetResponseData直接用GridControl 的DataSource綁定到傳回的記錄集上,如果有顯示不正確的說明在DataSet里或著Columns的FiledName不正確
明細選擇不要背景色 Appearance FocuseRow HideSelectionRow
內(nèi)部Enter能跳動 GridView OptionsNavigation EnterMoveNextColoumn→True
IndicatorWidth 行頭的寬度設(shè)置
Tab鍵可用:OptionsBehavior→FocusLeaveOnTab →True
設(shè)置列是否可移動,可篩選,可排序:OptionsCustomization→AllowColumnMoving→False AllowFilter→False AllowSort→False
光標(biāo)進入單元格而不是整行的設(shè)置:OptionsSelect EnableApppearanceFocusedRow→ False MultiSelect→CellSelect
明細進入處于編輯狀態(tài):OptionsSelection→EnableAppearanceFocuseRow→False MultiSelectMode→CellSelect
Columns的設(shè)置 ColumnEdit設(shè)置列的類型比如combox
FieldName 填充的字段名
列的操作OptionsColumn →AllowEdit,AllowFocus,ReadOnly,TabStop
數(shù)字型注意設(shè)置DisplayFormat,對齊方式一般是右對齊設(shè)置在AppearanceCell→TextOptions→HAlignment→Far,數(shù)字型有時候需要清空處理,賦成空會出現(xiàn)錯誤,要賦成Null就需要設(shè)置ColumnEdit→AllowNullInput→True
有多個明細不出現(xiàn)Tab選項上面文字 OptionsDetail→ShowDetailTabs → False
一次只展開一個明細的數(shù)據(jù) OptionsDetail→AllowOnlyOneMasterRowExpanded → True
Combox在明細沒有顯示出來 ShowButtonMode → ShowAlways 初始化的時候也需要加載數(shù)據(jù)
檢索畫面需要單雙行顏色不一致 OptionsView → EnableAppearanceEvenRow → True 在設(shè)計代碼中加上皮膚顏色
NumberSpinTextBox
Properties → DisplayFormat,EditFormat 設(shè)置Numeric
EditMask設(shè)置d Mask EditMask設(shè)置d
MaxValue,MinValue
DateTextBox
Properties → DisplayFormat,EditFormat 設(shè)置DataTime
Mask UseMaskAsDisplayFormat True
MaxValue,MinValue
CustomDrawRowIndicator用于處理行頭的自動編號
InvalidRowException 用于只捕捉自定義異常,如果不寫這個事件的話,如果列輸入的格式不正確的話系統(tǒng)會自動報出輸入的字符串格式不正確,但這個是它內(nèi)部捕捉的,這個不要讓它報出來就在這個事件里寫
ValidateRow 用于行離開時處理,列本身長度的控制是MaxLength,但這個是字符長度,通常需要按字節(jié)截取,行離開的時候字節(jié)截取就在這個事件處理;判斷數(shù)據(jù)合法性也在這個事件處理,需要注意的是在之前調(diào)用View的CloseEditor()用于關(guān)閉編輯狀態(tài),如果沒用這方法的話會出現(xiàn)有時行離開取不到之前的值最后需要刷新記錄集UpdateCurrentRow()
ValidatingEditor 用于處理正在編輯離開處理,這個事件可以用來處理合法性的判斷,但它只能捕捉到有值改變的情況下,如果是直接是空離開,是不觸發(fā)的,如果是有值的情況再改變成空是可以觸發(fā)的
控件的Enter事件
如this.LastText = this.ViewMaterial.GetRowCellValue(this.ViewMaterial.FocusedRowHandle,"MaterialID").ToString();
控件的Leave事件
用于如ID離開取出相應(yīng)的名稱,或者補0,或者后面的列清空,注意數(shù)字型的清空如果之前設(shè)置了允許Null的情況,清空時列的值是賦成null
文本和Combox組合的情況
選擇框賦值時注意,選擇框沒有SelectIndex屬性,賦值的時候就用SetRowCellValue(this.ViewMaterial.FocusedRowHandle, ViewMaterial.Columns["UnitName"], this.cmbMXUnitName.Items[i])
SelectedIndexChanged 用于處理選擇后給文本賦值
SetRowCellValue(this.ViewMaterial.FocusedRowHandle, ViewMaterial.Columns["MXUnitID"], ((DevExpress.XtraEditors.ComboBoxEdit)sender).SelectedItem.ToString().Substring(0, vLength));
事件 Leave 和Validated是不同的,特別是在需要補0的控件,需要使用Validated才會有效果,他們的區(qū)別在于Validated是先檢驗處理,在觸發(fā)Leave事件,而Leave就只是離開時
1.明細部分移動由Enter改成Tab,設(shè)置參照上面的
2.主的有效明細字段清空時,清空后面的數(shù)據(jù)
3.主的有效明細字段為空的時候,不提示錯誤信息,因為該行不作為數(shù)據(jù)收集
4.如果主的有效明細字段不為空的時候,其他有效明細字段為空,提示錯誤信息
圖形說明上述情況:
材料編號作為主的有效明細字段
(2)如果材料編號清空的話,材料名,規(guī)格,數(shù)量,單位就要清空
(3)如果材料編號為空,就算數(shù)量,單位不為空也不提示錯誤,因為編號沒填就不是有效明細
(4)如果材料編號不為空,數(shù)量或單位為空,提示錯誤信息
1.組合控件:如TextBox+Label+Button或TextBox+ComboBox的字段,字段標(biāo)題居中顯示
2.數(shù)字類型的數(shù)據(jù)右對齊,數(shù)字類型的控件有CalcEdit和SpinEdit,可以通過需求選擇,兩者的區(qū)別
CalcEdit:沒有MaxValue和MinValue
SpinEdit:可以通過設(shè)置MaxValue和MinValue屬性設(shè)置數(shù)字大小
共同點:設(shè)置MaxLength,最大長度;設(shè)置輸入格式,Mask→EditMask
顯示格式:DisplayFormat
畫面顯示時按顯示格式要求顯示時:Mask→UseMaskAsDisplayFormat=True
金額計算方式 / 顯示格式:SummaryItem→SummaryType / DisplayFormat
3.ComboBoxEdit的使用
焦點不能進入:AllowFocus=false
不能進行編輯:TextEditStyle=DisableTextEditor
調(diào)用該控件的字段的屬性設(shè)置:OptionsColumn→AllowMove=false,TabStop=false
4.ButtonEdit的使用
只顯示按鈕:TextEditStyle=HideTextEditor
寬度:Width=22
5.用于只讀控件的屬性設(shè)置,OptionsColumn 的AllowEdit=false、AllowFocus=false、ReadOnly=True、TabStop=false
6.明細內(nèi)部字段和基本的字段設(shè)計相同部分按照基本設(shè)計修改,明細行高為20(此為默認行高,不需要進行設(shè)置)
7.若無法正好顯示明細內(nèi)行,經(jīng)確認后再行修改,不得隨意按個人意愿修改
關(guān)于之前遺留問題解決方案:
1.明細行離開會把全部錯誤信息都提示出來,如果某一列已經(jīng)合法了錯誤提示信息依然存在,并不能及時清空錯誤信息,原因是在ValidatingEditor事件沒有清空ValidateRow事件時捕捉的錯誤,辦法是在ValidatingEditor事件里,如果合法就清空ValidateRow事件時捕捉的錯誤清空調(diào)用方法如 XX.SetColumnError(this.XX.Columns["Quantity"], "");
2.關(guān)于明細復(fù)選框勾選不上的原因,明細復(fù)選框的數(shù)據(jù)源必須是bool型,所以在數(shù)據(jù)集綁定的字段要設(shè)置DataType為System.Boolean,默認是System.String
3.明細數(shù)字用到SpinEdit如果在單元格上下列點擊,再關(guān)閉窗體出現(xiàn)系統(tǒng)錯誤,原因是在ValidatingEditor事件中e.Value是null,而用于接受數(shù)字值是CastUtility.ToDecimal(e.Value.ToString()),e.Value.ToString()是會轉(zhuǎn)換失敗的,解決辦法是如果判斷當(dāng)前列是數(shù)字的話,先判斷e.Value是不是Null在不是Null的情況才進行下面的處理
關(guān)于明細中用到多個View 的情況,處理辦法如下:
1.關(guān)于關(guān)系記錄集的添加:在工程中(這個項目是添加在Core—>Relation)需要添加數(shù)據(jù)集xsd,在這里指定字段,以及主外鍵關(guān)系,編譯以后在工具箱的組件中就會有剛添加的關(guān)系數(shù)據(jù)集,然后拖到現(xiàn)窗體畫面
2.本身View先畫好主的以后,再添加Level,選擇Level所需要用的View類型(本身屬性設(shè)置略)這個時候子View里的FiledList是沒有任何字段的
3.指定關(guān)系綁定數(shù)據(jù),這個是最重要的部分
默認情況,在GirdControl里的DataSource是無法選擇剛添加的記錄集中主表,而只有在界面設(shè)計類中通過代碼來添加,打開Windows 窗體設(shè)計器生成的代碼 ,添加如this.GridList.DataSource = this.dsOrder1.Order;這樣回到窗體設(shè)計畫面看到DataSource里綁定的是dsOrder1.Order,這樣綁定了以后運行仍然是不正確的,不能出現(xiàn)子表設(shè)計畫面,在 GirdControl上有兩個按鈕一個Retrieve Details和Run Designer,需要點擊Retrieve Details然后會出現(xiàn)對話框,選擇清空所有格式,這個時候Level中的之前畫好的View會被清掉,被默認的取代,這個時候,點擊新的View,然后會有兩個選項,一個是新的設(shè)計View類型,一個是自己之前畫好的子View,點擊選擇子View,這樣就完成了主與子表的設(shè)計,這個時候再點擊明細內(nèi)部設(shè)計的Columns子View里的FiledLis就會出現(xiàn)字段
這樣處理完了之后,怎么把數(shù)據(jù)加載到記錄集數(shù)據(jù)的問題
需要把數(shù)據(jù)導(dǎo)入到主表和子表中去 ,如
for (int i = 0; i < vResponse.Tables[0].Rows.Count; i++) { DataRow rw = vResponse.Tables[0].Rows[i]; this.dsOrder1.Order.ImportRow(rw); } for (int j = 0; j < vResponse.Tables[1].Rows.Count; j++) { DataRow rw = vResponse.Tables[1].Rows[j]; this.dsOrder1.OrderDetail.ImportRow(rw); }
要注意的是記錄集的清空Clear(),特別是設(shè)置了主外鍵的時候,數(shù)據(jù)重復(fù)的話會沖突
行頭自動編號
private void ViewMaterial_CustomDrawRowIndicator(object sender, DevExpress.XtraGrid.Views.Grid.RowIndicatorCustomDrawEventArgs e) { if (e.Info.IsRowIndicator && e.RowHandle >= 0) { e.Info.DisplayText = (e.RowHandle + 1).ToString().Trim(); } }
下面再介紹關(guān)于怎么處理子的View里列離開事件響應(yīng)處理的問題
通常情況下如Enter事件是
this.LastText = this.ViewData1.GetRowCellValue(this.ViewData1.FocusedRowHandle, "BillStatus").ToString();但是這個語句在子的View是不管用的,因為當(dāng)前的FocusedRowHandle值是無法定位到子表中的位置,處理辦法是用先接受當(dāng)前GridView,只有判斷當(dāng)前是子的View的時候,再用當(dāng)前View的FocusedRowHandle才能知道是哪一行
關(guān)于怎么接受字段值的問題:用之前實例過的View的GetDataRow(vRow) vRow就是用前面FocusedRowHandle
DevExpress.XtraGrid.Views.Grid.GridView view = this.GridList.FocusedView asDevExpress.XtraGrid.Views.Grid.GridView; DataRow rw = view.GetDataRow(view.FocusedRowHandle); this.LastText = rw["StatusID"].ToString();
關(guān)于怎么賦值給指定的列的問題:用之前實例過的View的SetFocusedRowCellValue
要注意的是事件中接受剛輸入的值,以前是XXView. CloseEditor,才能接受新的值,但如果有多個View如果是用子View名. CloseEditor是沒有作用的,需要用之前實例過當(dāng)前的View的CloseEditor
頁腳合計值的設(shè)置
首先View的ShowFooter 要設(shè)置成True,Columns的SummaryItem設(shè)置格式
默認合計是以行為單位,但如果要使界面能即使刷新是用ViewData.RefreshData();
取得合計值用ViewData.Columns["ProductMoney"].SummaryText
數(shù)字控件SpinEdit 邊框默認會有下拉框,去掉的話是在Buttons中移除,同樣計算器也是這樣
出現(xiàn)滾動條設(shè)置在ColumnAutoWidth→ False
不要出現(xiàn)頁腳設(shè)置在ShowFooter →Flase
報表部分
紙型設(shè)置PaperKind A4 邊距設(shè)置Margins
明細控制只讀以及顏色的控制,現(xiàn)在是通過GridView_ShowingEditor和RowCellStyle組合控制,只是有個問題,如果e.Cancel =true的話會使明細的Enter鍵無效了,所以要處理如果讓他能跳動就不要把e.Cancel 設(shè)置為 true,只是這個有點不好的是被鎖住的列光標(biāo)能進入,只是不能編輯
在ShowingEdito事件中通過this.GridView.FocusedColumn.FieldName來判斷是否允許編輯如果可以編輯this.GridView.FocusedColumn.OptionsColumn.ReadOnly = false ; e.Cancel = false
RowCellStyle事件主要控制顏色的顯示,要注意的是獲取列不能用FocusedColumn而要用 e.Column.FieldName,得到要設(shè)置的列后通過e.Appearance.BackColor設(shè)置背景色
有子明細的View,有時候需要獲得它父類的所在行編號
通過實例化View對象
DevExpress.XtraGrid.Views.Grid.GridView vFocusView = this.GridList.FocusedView asDevExpress.XtraGrid.Views.Grid.GridView;
通過vFocusView.Name判斷是父View還是子View
如果是父View用vFocusView.FocusedRowHandle;如果是子View用vFocusView.SourceRowHandle
在子View里有檢索按鈕的話,如果檢索畫面跳出來后,明細行縮上去了,所以返回后賦值會找不到所要賦值的行,解決辦法是先在記錄父View所在行,用DataRow 記錄子View檢索后的數(shù)據(jù)最終反應(yīng)到記錄集中
DevExpress.XtraGrid.Views.Grid.GridView vFocusView = this.GridMaterialList.FocusedView asDevExpress.XtraGrid.Views.Grid.GridView; //實例化對象 int vParentRowHandle = vFocusView.SourceRowHandle; //獲得父類位置 this.GridMaterialView.BeginUpdate(); DataRow rw1 = vFocusView.GetDataRow(vFocusView.FocusedRowHandle);//獲得子類當(dāng)前行的記錄 FrmSearch search = new FrmSearch(SearchMode.供應(yīng)商查詢); if (search.CD1 != null && !search.CD1.Equals("")) { this.GridMaterialView.ExpandMasterRow(vParentRowHandle); //展開父類 AgtProvider agt2 = new AgtProvider(); agt2.ProviderID = search.CD1; DataSet vResponse = agt2.Get(); if (vResponse.Tables[0].Rows.Count > 0) { rw1["ProviderID"] = vResponse.Tables[0].Rows[0]["ProviderID"]; //設(shè)置查詢到的數(shù)據(jù) } } this.GridMaterialView.EndUpdate();
明細行中有按鈕上面文字要出來,默認是...內(nèi)部按鈕 Buttons→Caption設(shè)置要顯示的字 Kind→Glyph
報錯時需要把光標(biāo)定義到子明細的列上
//把光標(biāo)定義到父類 this.GridMaterialView.FocusedRowHandle = i; this.GridMaterialView.ExpandMasterRow(i); //通過實例化父類對象,光標(biāo)指定到子明細中 GridView vFocusView = (GridView)this.GridMaterialView.GetVisibleDetailView(i); this.GridMaterialList.FocusedView = vFocusView; vFocusView.Focus(); vFocusView.FocusedRowHandle = j; vFocusView.FocusedColumn = vFocusView.Columns["ProvideQuantity"];
關(guān)于消息提示,跳出畫面的總結(jié)
這是一種組合出來的結(jié)果。主畫面通過alertControl來控制顯示的樣子
底下紅色部分是用戶自定義控件,通過imageList來顯示相應(yīng)圖片,添加的辦法是在alertControl的Buttons中添加
關(guān)于內(nèi)容部分可以設(shè)置字體顏色在alertControl的AppearanceText→ForeColor
可以設(shè)置提示時間AutoFormDelay
可以設(shè)置初始化的狀態(tài),比如跳出的位置;是否柵住,在alertControl1_FormLoad事件中處理
自定義按鈕的事件處理在alertControl1_ButtonClick;把當(dāng)前提示框關(guān)閉e.AlertForm.Close()
文本連接事件處理在alertControl1_AlertClick
獲取界面上有多少個提示框通過alertControl1.AlertFormList.Count
提示框跳出來的辦法是control.Show(FindForm(),”標(biāo)題”,”內(nèi)容”,””,圖片,null);
消息提示,使窗體閃動
[System.Runtime.InteropServices.DllImport("user32")] private static extern long FlashWindow(IntPtr hwnd, bool bInvert); private void button2_Click(object sender, EventArgs e) { FlashWindow(this.Handle, true); }
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:網(wǎng)絡(luò)轉(zhuǎn)載