咱們在開發Winform程序的時候,須要常常性的對界面的一些控件進行初始化,或者常常簡單的封裝,以方便咱們在界面設計過程當中反覆使用。本文主要介紹在個人一些項目中常常性的界面處理操做和代碼,以便爲你們開發的時候提供必要的參考。數據庫
在一些系統模塊裏面,咱們須要選擇系統人員做爲經辦人員的操做,以下面幾個界面場景所示。設計模式
咱們注意到,通常在咱們選擇的時候,界面會彈出一個新的層給咱們選擇,裏面經過列表詳細展現相關的信息,還能夠支持搜索,很是方便。ide
當咱們完成選擇的時候,咱們看到界面會只有一我的員名稱的顯示,不佔用額外的地方顯示。函數
這種界面效果是如何實現的呢?下面進行詳細的介紹。工具
1)首先咱們定義一個自定義控件,讓其繼承自XtraUserControl 便可。this
/// <summary> /// 經辦人員、操做人員的選擇控件封裝 /// </summary> public partial class OperatorSelectControl : XtraUserControl {
2)而後在DevExpress的界面工具箱上拖動一個SearchLookUpEdit 控件到咱們新的用戶控件OperatorSelectControl 上。spa
調整好用戶界面控件的排版相關屬性,就會獲得下面的界面所示。設計
3)在設計視圖裏面,咱們爲這個SearchLookUpEdit控件的GridView設置它的顯示字段,以下所示,每一個字段主要綁定FieldName(屬性或者字段)和Caption(顯示名稱)。code
這些必備的處理操做完成後,咱們能夠經過代碼或者設計器把這個控件的顯示內容和存儲內容進行設定,並綁定它的數據源便可(根據須要調用本身的函數),以下所示。orm
private void OperatorSelectControl_Load(object sender, EventArgs e) { if (!this.DesignMode) { txtOperator.Properties.ValueMember = "ID"; txtOperator.Properties.DisplayMember = "FullName"; txtOperator.Properties.DataSource = SecurityHelper.GetSimpleUsers(); } }
4)咱們爲了方便,還能夠進一步處理控件的顯示內容和返回的值內容,咱們但願綁定值或者獲取值的時候,使用Text屬性就能夠了,那麼咱們重載一下這個自定義控件的Text屬性便可。
public override string Text { get { string result = ""; if (this.txtOperator.EditValue != null) { result = this.txtOperator.EditValue.ToString(); } return result; } set { this.txtOperator.EditValue = value; } }
5)這樣控件的操做就完成了,編譯代碼後,咱們在工具箱上就能夠看到最新的控件圖標了。
接着咱們把相關的控件拖動到須要的地方(若是是界面和控件在相同的工程裏面,注意須要移除重複的工程引用),從新編譯系統代碼,那麼本文開始的界面效果就能夠出現了。
剛纔說了,人員選擇可使用這種彈出列表選擇的方式,其實不少地方能夠用這個方式來進行選擇,如一些相對比較少記錄的信息就很適合這種顯示方式,好比在會員管理裏面的,會員卡級別的選擇,也能夠採用這種方式。
這個模塊的作法也和第一種很相似,有點不一樣的是,我須要選擇後把會員卡的折扣也關聯顯示出來,那咱們應該如何處理呢?
1)定義控件和事件處理
爲了方便在控件選擇後進行事件的觸發處理,我在這裏定義了一個事件處理器SelectedValueChanged
/// <summary> /// 卡級選擇控件 /// </summary> public partial class CardGradeSelectControl : XtraUserControl { /// <summary> /// 選擇項發生變化的事件處理 /// </summary> public event EventHandler SelectedValueChanged;
而後在內部控件的EditValue改變的時候,在其中的事件裏面觸發咱們自定義的事件便可, 以下所示。
private void txtCardGrade_EditValueChanged(object sender, EventArgs e) { if (SelectedValueChanged != null) { SelectedValueChanged(sender, e); } }
2)在窗體界面中自定義控件的事件調用
在會員編輯界面裏面,咱們對這個卡級別的選擇控件的自定義事件進行處理便可。
處理事件裏面,咱們獲取對應卡級別的優惠折扣(GetDiscountByGradeNo),而後綁定到界面的控件顯示便可,這樣就實現了聯動效果了。
public partial class FrmEditMember : BaseEditForm { /// <summary> /// 建立一個臨時對象,方便在附件管理中獲取存在的GUID /// </summary> private MemberInfo tempInfo = new MemberInfo(); public FrmEditMember() { InitializeComponent(); this.txtCardGrade.SelectedValueChanged += new EventHandler(txtCardGrade_SelectedValueChanged); } void txtCardGrade_SelectedValueChanged(object sender, EventArgs e) { string gradeNo = txtCardGrade.Text; if (!string.IsNullOrEmpty(gradeNo)) { this.txtDiscount.Value = BLLFactory<CardGrade>.Instance.GetDiscountByGradeNo(gradeNo); } }
在咱們窗體數據的編輯界面裏面,爲了友好顯示,咱們可能須要顯示數據的建立人和建立時間。這種效果是如何實現的,咱們來看看。
1)數據顯示時候處理
數據顯示的時候,多是新增界面的顯示,也能夠是現有記錄的顯示,咱們須要區分對待。
若是是已有數據,咱們須要解析建立人員的ID,顯示已有時間便可;若是是新增界面,那麼咱們把當前登錄用戶的名稱顯示出來,及顯示當前時間便可。
在設計模式裏面,把控件設置爲ReadOnly=true,不用編輯修改控件的值便可。
/// <summary> /// 數據顯示的函數 /// </summary> public override void DisplayData() { InitDictItem();//數據字典加載(公用) if (!string.IsNullOrEmpty(ID)) { #region 顯示信息 MemberInfo info = BLLFactory<WHC.Member.BLL.Member>.Instance.FindByID(ID); if (info != null) { tempInfo = info;//從新給臨時對象賦值,使之指向存在的記錄對象 txtHandNo.Text = info.HandNo; txtCardNo.Text = info.CardNo; txtCardCode.Text = info.CardCode; txtCardStatus.SetComboBoxItem(info.CardStatus.ToString()); txtOpenUser.Text = info.OpenUser;
.............. txtCreator.Text = SecurityHelper.GetFullNameByID(info.Creator); txtCreateTime.SetDateTime(info.CreateTime); } #endregion } else {this.txtOpenDate.DateTime = DateTime.Now; this.txtHandNo.Text = IDUtils.NewId(); this.txtCreateTime.DateTime = DateTime.Now; this.txtCreator.Text = LoginUserInfo.FullName;//默認爲當前登陸用戶 } this.portraitControl1.MemberID = tempInfo.ID; this.portraitControl1.BindPicture(tempInfo.ID); //tempInfo在對象存在則爲指定對象,新建則是全新的對象,但有一些初始化的GUID用於附件上傳 SetAttachInfo(tempInfo); }
但用戶保存操做的時候,若是是新增數據,咱們須要把當前時間和當前用戶的信息記錄到數據庫裏面,所以須要增長一些代碼進行數據的關聯處理。
/// <summary> /// 新增狀態下的數據保存 /// </summary> /// <returns></returns> public override bool SaveAddNew() { MemberInfo info = tempInfo;//必須使用存在的局部變量,由於部分信息可能被附件使用 SetInfo(info); info.Creator = LoginUserInfo.ID.ToString(); info.CreateTime = DateTime.Now; info.Dept_ID = LoginUserInfo.DeptId; info.Company_ID = LoginUserInfo.CompanyId; try { #region 新增數據 //檢查是否還有其餘相同關鍵字的記錄 bool exist = BLLFactory<WHC.Member.BLL.Member>.Instance.IsExistKey("CardNo", info.CardNo); if (exist) { MessageDxUtil.ShowTips("指定的【會員卡號】已經存在,不能重複添加,請修改"); return false; } bool succeed = BLLFactory<WHC.Member.BLL.Member>.Instance.Insert(info); if (succeed) { //可添加其餘關聯操做 return true; } #endregion } catch (Exception ex) { LogTextHelper.Error(ex); MessageDxUtil.ShowError(ex.Message); } return false; }
咱們爲了方便,通常是在數據庫存儲人員的ID,可是列表顯示的時候,咱們也就須要把對應的人員ID轉換爲人員名稱了。
this.winGridViewPager1.gridView1.CustomColumnDisplayText += new DevExpress.XtraGrid.Views.Base.CustomColumnDisplayTextEventHandler(gridView1_CustomColumnDisplayText);
void gridView1_CustomColumnDisplayText(object sender, DevExpress.XtraGrid.Views.Base.CustomColumnDisplayTextEventArgs e) { if (e.Column.FieldName == "Operator" || e.Column.FieldName == "Editor" || e.Column.FieldName == "Creator") { if (e.Value != null) { e.DisplayText = SecurityHelper.GetFullNameByID(e.Value.ToString()); } } }