我們?cè)陂_發(fā)Winform程序的時(shí)候廓潜,需要經(jīng)常性的對(duì)界面的一些控件進(jìn)行初始化阱佛,或者經(jīng)常簡(jiǎn)單的封裝,以方便我們?cè)诮缑嬖O(shè)計(jì)過程中反復(fù)使用耍缴。本文主要介紹在我的一些項(xiàng)目中經(jīng)常性的界面處理操作和代碼砾肺,以便為大家開發(fā)的時(shí)候提供必要的參考齐佳。
1、選擇用戶的控件封裝操作
在一些系統(tǒng)模塊里面债沮,我們需要選擇系統(tǒng)人員作為經(jīng)辦人員的操作炼吴,如下面幾個(gè)界面場(chǎng)景所示。
我們注意到疫衩,一般在我們選擇的時(shí)候硅蹦,界面會(huì)彈出一個(gè)新的層給我們選擇,里面通過列表詳細(xì)展示相關(guān)的信息闷煤,還可以支持搜索童芹,非常方便。
當(dāng)我們完成選擇的時(shí)候鲤拿,我們看到界面會(huì)只有一個(gè)人員名稱的顯示假褪,不占用額外的地方顯示。
這種界面效果是如何實(shí)現(xiàn)的呢近顷?下面進(jìn)行詳細(xì)的介紹生音。
1)首先我們定義一個(gè)自定義控件,讓其繼承自XtraUserControl 即可窒升。
/// <summary>
/// 經(jīng)辦人員缀遍、操作人員的選擇控件封裝
/// </summary>
public partial class OperatorSelectControl : XtraUserControl
{
2)然后在DevExpress的界面工具箱上拖動(dòng)一個(gè)SearchLookUpEdit 控件到我們新的用戶控件OperatorSelectControl 上。
調(diào)整好用戶界面控件的排版相關(guān)屬性,就會(huì)得到下面的界面所示。
3)在設(shè)計(jì)視圖里面滚澜,我們?yōu)檫@個(gè)SearchLookUpEdit控件的GridView設(shè)置它的顯示字段,如下所示譬挚,每個(gè)字段主要綁定FieldName(屬性或者字段)和Caption(顯示名稱)。
這些必備的處理操作完成后酪呻,我們可以通過代碼或者設(shè)計(jì)器把這個(gè)控件的顯示內(nèi)容和存儲(chǔ)內(nèi)容進(jìn)行設(shè)定减宣,并綁定它的數(shù)據(jù)源即可(根據(jù)需要調(diào)用自己的函數(shù)),如下所示号杠。
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)我們?yōu)榱朔奖泸揭福€可以進(jìn)一步處理控件的顯示內(nèi)容和返回的值內(nèi)容,我們希望綁定值或者獲取值的時(shí)候姨蟋,使用Text屬性就可以了屉凯,那么我們重載一下這個(gè)自定義控件的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)這樣控件的操作就完成了眼溶,編譯代碼后悠砚,我們?cè)诠ぞ呦渖暇涂梢钥吹阶钚碌目丶D標(biāo)了。
接著我們把相關(guān)的控件拖動(dòng)到需要的地方(如果是界面和控件在相同的工程里面堂飞,注意需要移除重復(fù)的工程引用)灌旧,重新編譯系統(tǒng)代碼绑咱,那么本文開始的界面效果就可以出現(xiàn)了。
2枢泰、會(huì)員卡級(jí)別選擇操作
剛才說了描融,人員選擇可以使用這種彈出列表選擇的方式,其實(shí)很多地方可以用這個(gè)方式來進(jìn)行選擇衡蚂,如一些相對(duì)比較少記錄的信息就很適合這種顯示方式窿克,比如在會(huì)員管理里面的,會(huì)員卡級(jí)別的選擇毛甲,也可以采用這種方式年叮。
這個(gè)模塊的做法也和第一種很類似,有點(diǎn)不同的是玻募,我需要選擇后把會(huì)員卡的折扣也關(guān)聯(lián)顯示出來只损,那我們應(yīng)該如何處理呢?
1)定義控件和事件處理
為了方便在控件選擇后進(jìn)行事件的觸發(fā)處理七咧,我在這里定義了一個(gè)事件處理器SelectedValueChanged
/// <summary>
/// 卡級(jí)選擇控件
/// </summary>
public partial class CardGradeSelectControl : XtraUserControl
{
/// <summary>
/// 選擇項(xiàng)發(fā)生變化的事件處理
/// </summary>
public event EventHandler SelectedValueChanged;
然后在內(nèi)部控件的EditValue改變的時(shí)候跃惫,在其中的事件里面觸發(fā)我們自定義的事件即可, 如下所示坑雅。
private void txtCardGrade_EditValueChanged(object sender, EventArgs e)
{
if (SelectedValueChanged != null)
{
SelectedValueChanged(sender, e);
}
}
2)在窗體界面中自定義控件的事件調(diào)用
在會(huì)員編輯界面里面辈挂,我們對(duì)這個(gè)卡級(jí)別的選擇控件的自定義事件進(jìn)行處理即可。
處理事件里面裹粤,我們獲取對(duì)應(yīng)卡級(jí)別的優(yōu)惠折扣(GetDiscountByGradeNo),然后綁定到界面的控件顯示即可蜂林,這樣就實(shí)現(xiàn)了聯(lián)動(dòng)效果了遥诉。
public partial class FrmEditMember : BaseEditForm
{
/// <summary>
/// 創(chuàng)建一個(gè)臨時(shí)對(duì)象,方便在附件管理中獲取存在的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);
}
}
3噪叙、創(chuàng)建人員和創(chuàng)建時(shí)間的顯示處理
在我們窗體數(shù)據(jù)的編輯界面里面矮锈,為了友好顯示,我們可能需要顯示數(shù)據(jù)的創(chuàng)建人和創(chuàng)建時(shí)間睁蕾。這種效果是如何實(shí)現(xiàn)的苞笨,我們來看看。
1)數(shù)據(jù)顯示時(shí)候處理
數(shù)據(jù)顯示的時(shí)候子眶,可能是新增界面的顯示瀑凝,也可以是現(xiàn)有記錄的顯示,我們需要區(qū)分對(duì)待臭杰。
如果是已有數(shù)據(jù)粤咪,我們需要解析創(chuàng)建人員的ID,顯示已有時(shí)間即可渴杆;如果是新增界面寥枝,那么我們把當(dāng)前登陸用戶的名稱顯示出來宪塔,及顯示當(dāng)前時(shí)間即可。
在設(shè)計(jì)模式里面囊拜,把控件設(shè)置為ReadOnly=true某筐,不用編輯修改控件的值即可。
/// <summary>
/// 數(shù)據(jù)顯示的函數(shù)
/// </summary>
public override void DisplayData()
{
InitDictItem();//數(shù)據(jù)字典加載(公用)
if (!string.IsNullOrEmpty(ID))
{
#region 顯示信息
MemberInfo info = BLLFactory<WHC.Member.BLL.Member>.Instance.FindByID(ID);
if (info != null)
{
tempInfo = info;//重新給臨時(shí)對(duì)象賦值冠跷,使之指向存在的記錄對(duì)象
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;//默認(rèn)為當(dāng)前登錄用戶
}
this.portraitControl1.MemberID = tempInfo.ID;
this.portraitControl1.BindPicture(tempInfo.ID);
//tempInfo在對(duì)象存在則為指定對(duì)象南誊,新建則是全新的對(duì)象,但有一些初始化的GUID用于附件上傳
SetAttachInfo(tempInfo);
}
但用戶保存操作的時(shí)候蔽莱,如果是新增數(shù)據(jù)弟疆,我們需要把當(dāng)前時(shí)間和當(dāng)前用戶的信息記錄到數(shù)據(jù)庫里面,因此需要增加一些代碼進(jìn)行數(shù)據(jù)的關(guān)聯(lián)處理盗冷。
/// <summary>
/// 新增狀態(tài)下的數(shù)據(jù)保存
/// </summary>
/// <returns></returns>
public override bool SaveAddNew()
{
MemberInfo info = tempInfo;//必須使用存在的局部變量怠苔,因?yàn)椴糠中畔⒖赡鼙桓郊褂? SetInfo(info);
info.Creator = LoginUserInfo.ID.ToString();
info.CreateTime = DateTime.Now;
info.Dept_ID = LoginUserInfo.DeptId;
info.Company_ID = LoginUserInfo.CompanyId;
try
{
#region 新增數(shù)據(jù)
//檢查是否還有其他相同關(guān)鍵字的記錄
bool exist = BLLFactory<WHC.Member.BLL.Member>.Instance.IsExistKey("CardNo", info.CardNo);
if (exist)
{
MessageDxUtil.ShowTips("指定的【會(huì)員卡號(hào)】已經(jīng)存在,不能重復(fù)添加仪糖,請(qǐng)修改");
return false;
}
bool succeed = BLLFactory<WHC.Member.BLL.Member>.Instance.Insert(info);
if (succeed)
{
//可添加其他關(guān)聯(lián)操作
return true;
}
#endregion
}
catch (Exception ex)
{
LogTextHelper.Error(ex);
MessageDxUtil.ShowError(ex.Message);
}
return false;
}
我們?yōu)榱朔奖愀趟荆话闶窃跀?shù)據(jù)庫存儲(chǔ)人員的ID,但是列表顯示的時(shí)候锅劝,我們也就需要把對(duì)應(yīng)的人員ID轉(zhuǎn)換為人員名稱了攒驰。
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());
}
}
}