繁体   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