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