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

来源:https://www.cnblogs.com/wuhuacong/archive/2019/04/12/10695029.html
-Advertisement-
Play Games

在我們做客戶關係管理系統的Winform界面的時候,需要對進展階段這個屬性進行一個方便的動態切換和標記處理,如我們根據不同的進展階段顯示不同的相關信息,也可以隨時保存當前的階段信息。其實也是一個比較常見的功能,我們可以把字典列表扁平化動態展示在控制項上,然後根據用戶選擇的階段位置進行切換即可,本篇隨筆... ...


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

1、進展階段的動態展示和處理

我們來看看界面的大致情況

其實這部分是根據字典列表進行動態展示的,也就是使用一個用戶控制項進行處理即可。

為了實現這個功能,我們先創建一個用戶控制項,如下界面所示,保留一個按鈕,這個我們讓它先占著位置,最後還是把它追加到最後的位置上即可。

為了展示所有階段,並記錄當前階段,我們設置了兩個變數,放在用戶控制項裡面

        /// <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; }

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

    /// <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; }

為了動態展示控制項的信息,我們需要使用一個自定義函數來對控制項按鈕的位置進行判斷並繪製,這樣可以根據需要進行相關樣式的定義,也可以動態變化階段的列表內容。

        /// <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);
            }
        }

 

2、外部窗體使用自定義控制項

創建好用戶控制項後,在外部窗體使用這個用戶控制項的時候,我們把它拖到窗體界面裡面,如下設計界面效果所示。

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

            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();

實際項目運行的整體效果如下所示。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 今天自己開發了一個訂機票的微信公眾號,功能基本已經完成,然後想部署到伺服器實際測試下。結果部署上去出現各種問題。先安裝asp.net core模塊,然後發現資料庫並不像在開發時一樣,執行ef的命令行語句就可以了。可以到輸出目錄找到對應的sql語句,到伺服器上執行一下。 後來部署上去以後,發現很多對應... ...
  • 轉自:https://blog.csdn.net/jie_liang/article/details/77340905 用以記錄: 在sql查詢中為了提高查詢效率,我們常常會採取一些措施對查詢語句進行sql優化,下麵總結的一些方法,有需要的可以參考參考。 1.對查詢進行優化,應儘量避免全表掃描,首先 ...
  • //通過ClassName獲取div,使用setAttribute設置div禁止點擊 pointer-events: none;是css3新出現的屬性,意思就是禁止滑鼠點擊事件,當元素中有這一屬性時,鏈接、點擊事件統統失效 ...
  • 通過註解(特性)的方式進行對象的註冊與註入,方便,靈活! 本篇主要講如何去實現,下一篇主要講如何把它集成到mvc和api環境里,實現自動的註入! spring ioc工作的過程大致為,統一的註冊組件,攔截當前請求,統一的註入當前請求所需要的組件,事實上,說到這事,.net也完全可以實現這個功能和工作 ...
  • 看這個方案之前,先說明下為什麼要加入SSO,以防對大家產生不好的影響。我們產品使用傳統winform+db服務+Db存儲方式開發,一群老菜幫子開發,以傳統的datatble做數據傳遞,很多年了未有變化。 然後我來了,感覺我這個老菜幫子都受不了這種開發,然後下定決心,作了一些封裝,看起來有點像orm的 ...
  • 對於使用Windows操作系統的人來說,Windows Service(Windows服務)應該不會陌生。在Windows操作系統中,我們可以在”運行”視窗中運行service.msc,即可打開一個查看Windows服務的視窗。Windows服務基本都是一些後臺運行的服務進程,沒有UI界面,每個服務... ...
  • VS2010中有一個自帶的安裝部署項目,叫:Visual Studio Installer ,我們通常稱為:setup項目,是一個用於自定義安裝部署的項目方案。但是在VS2017,VS2019中均不見了,安裝程式組件中也沒有,通過強大的谷歌和百度,發現有一個擴展方案,在VS市場里有一個可用的VS擴展 ...
  • MVC記住賬號密碼 使用cookie操作 前端: JS代碼: 通過AJAX 傳輸數據 我們不僅要傳輸賬號和密碼 還有傳覆選框的狀態(參數CK) 在登錄的方法中: CK參數就是覆選框的狀態true或false 首先判斷資料庫中是否存在賬號密碼 之後判斷覆選框是否選中 選中: 創建一個cookie對象 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...