首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

WinForms UserControl 通知主窗口修改數據:自定義事件模式最佳實踐

     編輯:程式設計疑難解答

場景:主窗口 Form1 包含多個 UserControl,參數統一存儲在 XML。當用戶控件值改變時,需通知主窗口更新 XML 並同步其他控件顯示。

標準事件模式

// 1. UserControl 中定義事件
public partial class ParamControl : UserControl {
    // 事件參數攜帶修改後的鍵值對
    public event EventHandler ParamChanged;

    private void txtValue_TextChanged(object sender, EventArgs e) {
        ParamChanged?.Invoke(this, new ParamChangedEventArgs(key, txtValue.Text));
    }
}

public class ParamChangedEventArgs : EventArgs {
    public string Key { get; }
    public string Value { get; }
    public ParamChangedEventArgs(string k, string v) { Key = k; Value = v; }
}

// 2. 主窗口訂閱並處理
public partial class Form1 : Form {
    private void Form1_Load(object sender, EventArgs e) {
        foreach (var ctrl in this.Controls.OfType()) {
            ctrl.ParamChanged += OnParamChanged;
        }
    }

    private void OnParamChanged(object sender, ParamChangedEventArgs e) {
        // 更新 XML
        UpdateXml(e.Key, e.Value);
        // 同步其他控件/顯示日志
        txtLog.AppendText($"參數 {e.Key} 更新為 {e.Value}\r\n");
    }
}

優勢

  • 解耦:UserControl 無需知道 Form1 具體實現
  • 擴展性:新增控件只需訂閱事件
  • 線程安全:UI 事件天然在主線程

避免直接在 UserControl 中持有 Form1 引用調用 public 方法,那是強耦合的「面條代碼」。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved