在Winform系統界面中對進展階段的動態展現和處理

在咱們作客戶關係管理系統的Winform界面的時候,須要對進展階段這個屬性進行一個方便的動態切換和標記處理,如咱們根據不一樣的進展階段顯示不一樣的相關信息,也能夠隨時保存當前的階段信息。其實也是一個比較常見的功能,咱們能夠把字典列表扁平化動態展現在控件上,而後根據用戶選擇的階段位置進行切換便可,本篇隨筆就是在客戶的需求基礎上完善這個功能。ide

一、進展階段的動態展現和處理

咱們來看看界面的大體狀況函數

其實這部分是根據字典列表進行動態展現的,也就是使用一個用戶控件進行處理便可。this

爲了實現這個功能,咱們先建立一個用戶控件,以下界面所示,保留一個按鈕,這個咱們讓它先佔着位置,最後仍是把它追加到最後的位置上便可。spa

爲了展現全部階段,並記錄當前階段,咱們設置了兩個變量,放在用戶控件裏面設計

        /// <summary>
        /// 階段列表
        /// </summary>
        public List<CListItem> StageList { get; set; }
        /// <summary>
        /// 當前階段的值
        /// </summary>
        public double CurrentStage { get; set; }

而後爲了在切換和保存兩個事件觸發外部處理,咱們添加兩個事件處理,以下所示code

        /// <summary>
        /// 選中某個階段的處理事件
        /// </summary>
        public EventHandler OnSelectedStageHandler { get; set; }
        /// <summary>
        /// 設置階段完成的處理事件
        /// </summary>
        public EventHandler OnSetCompleteStage { get; set; }

這樣用戶控件看起來就像是這樣子的代碼了。orm

    /// <summary>
    /// 階段控件顯示
    /// </summary>
    public partial class StageControl : BaseUserControl
    {
        /// <summary>
        /// 階段列表
        /// </summary>
        public List<CListItem> StageList { get; set; }
        /// <summary>
        /// 當前階段的值
        /// </summary>
        public double CurrentStage { get; set; }
        /// <summary>
        /// 選中某個階段的處理事件
        /// </summary>
        public EventHandler OnSelectedStageHandler { get; set; }
        /// <summary>
        /// 設置階段完成的處理事件
        /// </summary>
        public EventHandler OnSetCompleteStage { get; set; }

爲了動態展現控件的信息,咱們須要使用一個自定義函數來對控件按鈕的位置進行判斷並繪製,這樣能夠根據須要進行相關樣式的定義,也能夠動態變化階段的列表內容。blog

        /// <summary>
        /// 初始化控件
        /// </summary>
        public void Init()
        {
            this.Controls.Clear();//清空界面

            //根據階段列表數量計算每一個選項的大小
            if (StageList != null && StageList.Count > 0)
            {
                var count = StageList.Count;
                //計算每項的寬度、高度
                var width = (this.Width-150) * 0.8 / (count * 1.0);
                var height = this.Height * 0.8;

                //計算間隔位置,默認爲0,最大不超過20寬度
                double space = 0;
                if ((count - 1) > 0)
                {
                    space = (this.Width * 0.2) / ((count - 1) * 1.0);
                }
                space = (space > 20) ? 20 : space; //限定最大間隔20

                //根據列表項目,動態構建按鈕顯示項目
                int i = 0;
                foreach (CListItem item in StageList)
                {
                    double value = Convert.ToDouble(item.Value);
                    SimpleButton button = new SimpleButton();
                    button.Text = value.ToString("P0");//顯示百分比
                    button.ToolTip = item.Text;
                    button.Tag = value;
                    button.ButtonStyle = BorderStyles.HotFlat;
                    button.Appearance.Options.UseBackColor = true;
                    //根據所處階段設置背景色
                    if(CurrentStage >= value)
                    {
                        button.Appearance.BackColor = Color.SkyBlue;
                    }
                    else
                    {
                        button.Appearance.BackColor = Color.Transparent;
                    }

                    //按鈕的單擊事件,觸發對外部的處理
                    button.Click += (s,e)=>
                    {
                        var currentStep = (SimpleButton)s;
                        CurrentStage = Convert.ToDouble(currentStep.Tag);
                        if(OnSelectedStageHandler != null)
                        {
                            OnSelectedStageHandler(s, e);
                        }
                        Init();

                    };
                    //根據計算好的信息,設置按鈕大小和位置
                    button.Size = new Size((int)width, (int)height);
                    button.Location = new Point(i * (int)(width + space), 0);
                    this.Controls.Add(button);

                    i++;
                }

                this.btnSetComplete.Location = new Point(this.Width-145, 4);
                this.Controls.Add(btnSetComplete);
            }
        }

若是是要保存狀態,也交由事件處理事件

        /// <summary>
        /// 完成操做,觸發外部對狀態的保存
        /// </summary>
        private void btnSetComplete_Click(object sender, EventArgs e)
        {
            if(OnSetCompleteStage != null)
            {
                OnSetCompleteStage(sender, e);
            }
        }

 

二、外部窗體使用自定義控件

建立好用戶控件後,在外部窗體使用這個用戶控件的時候,咱們把它拖到窗體界面裏面,以下設計界面效果所示。ip

在這個窗體裏面,初始化控件的事件處理,用來作選擇的變化處理和保存狀態處理。

            this.stageControl1.OnSelectedStageHandler += (s, e) =>
            {
                this.txtStage.SetComboBoxItem(string.Concat(this.stageControl1.CurrentStage));
            };
            this.stageControl1.OnSetCompleteStage += (s, e) =>
            {
                if (!string.IsNullOrEmpty(ID))
                {
                    this.txtStage.SetComboBoxItem(string.Concat(this.stageControl1.CurrentStage));
                    var result = CallerFactory<ISaleChanceService>.Instance.UpdateStage(tempInfo.ID, this.stageControl1.CurrentStage);
                    ShowMessageAutoHide(result.Success ? "設置成功" : "設置失敗");
                    ProcessDataSaved(null, null);
                }
            };

咱們在調用窗體使用這個進展階段的控件的時候,須要給它初始化數據,以下是對字典信息的綁定給它。

        /// <summary>
        /// 初始化數據字典
        /// </summary>
        private void InitDictItem()
        {
            //初始化代碼
            this.txtStatus.BindDictItems("機會狀態");
            this.txtSource.BindDictItems("機會來源");
            this.txtChanceType.BindDictItems("機會類別");

            this.txtCompetitiveIndex.BindDictItems("機會競爭指數");
            this.txtConfidenceIndex.BindDictItems("機會信心指數");
            this.txtStage.BindDictItems("機會進展階段");

            var listItem = DictItemUtil.GetDictByDictType("機會進展階段"); this.stageControl1.StageList = listItem;
        }   

而後在界面顯示的時候,調用Init函數便可,以下代碼所示。

            //初始化顯示控件
            this.stageControl1.Init();

實際項目運行的總體效果以下所示。

相關文章
相關標籤/搜索