Winform開發(fā)中常見界面的DevExpress處理操作

我們?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());
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市故爵,隨后出現(xiàn)的幾起案子玻粪,更是在濱河造成了極大的恐慌,老刑警劉巖诬垂,帶你破解...
    沈念sama閱讀 221,406評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件劲室,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡结窘,警方通過查閱死者的電腦和手機(jī)很洋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來隧枫,“玉大人喉磁,你說我怎么就攤上這事」倥В” “怎么了协怒?”我有些...
    開封第一講書人閱讀 167,815評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)确买。 經(jīng)常有香客問我斤讥,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,537評(píng)論 1 296
  • 正文 為了忘掉前任芭商,我火速辦了婚禮派草,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘铛楣。我一直安慰自己近迁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,536評(píng)論 6 397
  • 文/花漫 我一把揭開白布簸州。 她就那樣靜靜地躺著鉴竭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪岸浑。 梳的紋絲不亂的頭發(fā)上搏存,一...
    開封第一講書人閱讀 52,184評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音矢洲,去河邊找鬼璧眠。 笑死,一個(gè)胖子當(dāng)著我的面吹牛读虏,可吹牛的內(nèi)容都是我干的责静。 我是一名探鬼主播,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼盖桥,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼灾螃!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起揩徊,我...
    開封第一講書人閱讀 39,668評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤腰鬼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后塑荒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體垃喊,經(jīng)...
    沈念sama閱讀 46,212評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,299評(píng)論 3 340
  • 正文 我和宋清朗相戀三年袜炕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片初家。...
    茶點(diǎn)故事閱讀 40,438評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡偎窘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出溜在,到底是詐尸還是另有隱情陌知,我是刑警寧澤,帶...
    沈念sama閱讀 36,128評(píng)論 5 349
  • 正文 年R本政府宣布掖肋,位于F島的核電站仆葡,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜沿盅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,807評(píng)論 3 333
  • 文/蒙蒙 一把篓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧腰涧,春花似錦韧掩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至费彼,卻和暖如春滑臊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背箍铲。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工雇卷, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人虹钮。 一個(gè)月前我還...
    沈念sama閱讀 48,827評(píng)論 3 376
  • 正文 我出身青樓聋庵,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親芙粱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子祭玉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,446評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 一、簡(jiǎn)歷準(zhǔn)備 1春畔、個(gè)人技能 (1)自定義控件脱货、UI設(shè)計(jì)、常用動(dòng)畫特效 自定義控件 ①為什么要自定義控件律姨? Andr...
    lucas777閱讀 5,217評(píng)論 2 54
  • 一振峻、 上傳就是將信息從個(gè)人計(jì)算機(jī)(本地計(jì)算機(jī))傳遞到中央計(jì)算機(jī)(遠(yuǎn)程計(jì)算機(jī))系統(tǒng)上,讓網(wǎng)絡(luò)上的人都能看到择份。將制作好...
    柴不駝閱讀 194評(píng)論 0 0
  • @ 無雪的八臺(tái)山 從一臺(tái)到八臺(tái) 裸露的山路蜿蜒穿行 我來了四次 它就在我眼前裸露了四次 整個(gè)過程扣孟,無雪,也無欲 其...
    三春不歸閱讀 234評(píng)論 0 0
  • 用128G的Mac做iOS開發(fā)荣赶,相信你也和我一樣為內(nèi)存不夠用的情況~總結(jié)了下面這些占大空間的路徑凤价。雖然不是長(zhǎng)久之計(jì)...
    DeadRabbit閱讀 11,297評(píng)論 0 2
  • “天也歡喜,地也歡喜,人也歡喜侣滩,歡喜我遇到了你口注,你也遇到了我。 當(dāng)時(shí)是你心里有了一個(gè)我胜卤,我心里也有了一個(gè)你疆导,從今后...