簡體   English   中英

c#DataChanged事件確實在Windows窗體上觸發(桌面應用程序)

[英]c# DataChanged event does trigger on a windows form (Desktop Application)

我有一個表單,我選擇了一些checkboxes ,編輯了一些text field ,從combobox選擇了一個,等等,然后單擊“ Exit 基於“數據已更改?”的事實 我希望采取行動。 問題是我無法使事件正常進行:

private void DataChanged(object sender, EventArgs e)
{
    MessageBox.Show("Data is changed", "debug");
    isDataSaved = false;
}

什么時候調用此方法,如何使它起作用? 當表單的字段中包含一些數據(即filL一個文本框)時,是否應該觸發該事件?

我沒有真正得到API: DataChanged事件

注意:我正在遵循Mike Murach C#第5版第10章的示例。

編輯(書中的確切字詞):

為XXXX Name組合框的SelectedIndexChanged事件生成一個名為DataChanged的事件處理程序。 然后,將此事件處理程序連接到YYYYY方法標簽的TextChanged事件,並將代碼添加到此事件處理程序,以便將isDataSaved變量設置為false

當我雙擊組合框上生成的事件處理程序時,它的名稱不是DataChanged,而是cboNames_SelectedIndexChanged ...(這是一本書搞砸了,還是我完全不懂?PS:項目中沒有..'database')

我個人最近主要使用數據綁定來獲取有關數據更改的通知。

數據持有者類,實現INotifyPropertyChanged 此接口使您可以在屬性值更改時得到通知。

public class SomeData: INotifyPropertyChanged {
    public event PropertyChangedEventHandler PropertyChanged;

    private void SetProperty<T>(ref T field, T value, [CallerMemberName] string name = "") {
        if (!EqualityComparer<T>.Default.Equals(field, value)) {
            field = value;
            var handler = PropertyChanged;
            if (handler != null) {
              handler(this, new PropertyChangedEventArgs(name));
            }
        }
    }

    private boolean _someBoolean;
    public int SomeBoolean {
        get { return _someBoolean; }
        set { 
            SetProperty(ref _someBoolean, value);
        }
    }

    private string _someString;
    public string SomeString {
        get { return _someString; }
        set { 
            SetProperty(ref _someString, value);
        }
    }

    // etc
}

現在,我們的表單使用數據類及其INotifyPropertyChanged實現,以在數據發生更改時得到通知。

public partial class SomeForm: Form {
    private SomeData _data;
    private void LoadData() {
        _data = new SomeData();
        _data.PropertyChanged += Data_PropertyChanged;
    }

    private void SaveData() {
        // TODO: Save data
    }

    private void AddDataBindings() {
        checkbox1.DataBindings.Add("Checked", _data, "SomeBoolean");
        textbox1.DataBindings.Add("Text", _data, "SomeString");
        // add other
    }

    private void Data_PropertyChanged(object sender, PropertyChangedEventArgs e) {
        // Here you can add actions that must be triggered when some data changes.
        if (e.PropertyName == "SomeBoolean") {
            // Do something when some-boolean property changes
        }

        // Set is-changed-boolean to true to 'remember' that something has changed.
        _isChanged = true;

        // Give message
        MessageBox.Show(string.Format("Data changed, property {0}", e.PropertyName));
    }

    private bool _isChanged = false;

    protected void Form_Closed(object sender, EventArgs e) {
        // If data is changed, save it
        if (_isChanged) {
            SaveData();
        }           
    }
}

您的問題不知道方法DataChanged在哪里使用以及如何使用。 我建議您在屬性中使用“聚焦激活”。添加數據更改的打印方法“激活好運”。

您必須像這樣制作屬性

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM