C# ListBox 子項數據更新


今天在倒騰ListBox控件的數據編輯時,遇到了一個小小的問題,現在就把解決方法記錄下來,如果各位道友有更好的方法,一定要留言賜教。

 


 

問題還原:

有一個界面,有這么一個ListBox用來顯示所有的角色信息:

角色類的源代碼如下,反正可以想象成任意自定義的類都可以:

    /// <summary>
    /// 單個角色對象
    /// </summary>
    public class RoleItem
    {
        #region Public Property


        /// <summary>
        /// 角色的唯一代碼
        /// </summary>
        public string RoleCode { get; set; } = Guid.NewGuid().ToString("N");

        /// <summary>
        /// 角色名稱
        /// </summary>
        public string RoleName { get; set; }

        /// <summary>
        /// 角色描述
        /// </summary>
        public string Description { get; set; }

        /// <summary>
        /// 關聯的賬戶列表
        /// </summary>
        public List<string> Accounts { get; set; } = new List<string>();


        #endregion
        
        #region Object Override

        /// <summary>
        /// 返回對象的字符串標識形式
        /// </summary>
        /// <returns></returns>
        public override string ToString()
        {
            return RoleName;
        }
        
        #endregion

    }

  在控件加載的時候進行數據的初始化,這里不能使用datasouce來綁定數據源,不然不能修改單個的。下面的初始化也只是例子而已。

                List<RoleItem> roles = new List<RoleItem>();// 假設已經獲取到了數據
                
                foreach(var m in roles)
                {
                    listBox1.Items.Add(m);
                }

  在點擊界面的編輯按鈕時,獲取listBox1的選中項。然后修改類中的RoleName 屬性,所以正常的代碼如下編寫:

 private void userButton5_Click(object sender, EventArgs e)
        {
            if (listBox1.SelectedItem is RoleItem role)
            {
                // 點擊了編輯按鈕並獲取了需要修改的信息
                role.RoleName = role.RoleName + "1";
            }
        }

  上述代碼為示例,重要的是結果發現listBox1中的顯示沒有更新,然是數據確實更新了,但是即使調用了下面的三個刷新方法也是無濟於事。

                        listBox1.Refresh();
                        listBox1.Invalidate();
                        listBox1.Update();

  但是我在調用listBox1.Items.Add(object obj)時卻會自動更新,即使翻看微軟的源代碼,也沒有找到哪里可以刷新顯示的方法,源代碼地址:

http://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/ListBox.cs,81e38e1c58b6d37c

       所以參數上述的Add方法可以刷新,也就是整個變量重新賦值也可以刷新,所以上述的編輯代碼變更成了

 private void userButton5_Click(object sender, EventArgs e)
        {
            if (listBox1.SelectedItem is RoleItem role)
            {
                // 點擊了編輯按鈕並獲取了需要修改的信息
                role.RoleName = role.RoleName + "1";
                listBox1.Items[listBox1.SelectedIndex] = listBox1.Items[listBox1.SelectedIndex];
            }
        }

  暫時解決了方法,當點擊按鈕時,控件的界面也會跟着刷新,如果需要全部刷新,就要循環操作。

 

 

 

這個問題來自開發一個簡單通用的C-S架構的框架模版,地址為https://github.com/dathlin/ClientServerProject


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM