简体   繁体   中英

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

I have a form, I select some checkboxes , edit some text field , select from a combobox etc. then I click Exit . Based on the fact that "Data has been changed ??" I wish to perform actions. The problem is I can't get the event work :

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

When is this method called, how do I make it work? Is this supposed to get fired when the form's fields have some data ie filL a text box ?

I dont really get the API: DataChanged event

Note: I'm following Mike Murach C# 5th edition chapter 10 example.

Edit (exact words from book):

Generate an event handler named DataChanged for the SelectedIndexChanged event of the XXXX Name combo box. Then , wire this event handler to the TextChanged event of the YYYYY Method label and add the code to this event handler so it sets the isDataSaved variable to false

When I double click on the commbo box the generated event handler it is not named DataChanged but cboNames_SelectedIndexChanged... (is this a book screw up or me total noob ? PS: There is no .. 'database' in the project)

Personally I mostly use databinding these days to get notified of changes in data.

A data holder class, which implements INotifyPropertyChanged . This interface gives you the possibility to get notified when the value of a property changes.

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
}

Now our form, which uses the data class and it's INotifyPropertyChanged implementation to get notified when a change in data occurs.

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

Your problem is not known where the method DataChanged use and how. I have a suggestion for you that is use Focus Activated in properties.Add datachanged printing method Activated good luck.

You must make properties this like

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM