我使用绑定源,以便所有控件都绑定到数据源。像这样:
var category = categoryRequest.Get(id);
bindingSource.DataSource = category;
这很好用。
我还在DTO类上实现了INotifyPropertyChanged(即使不应该这样做),因此对象属性的更改会立即反映在相应的控件中。这也有效。
但是,如果用户加载一个对象,更改某些控件中的某些文本并决定关闭该表单,我想确定数据是否已更改并提示"您确定吗?"消息。
目前,我这样做的方式是这样的:
public static bool DataChanged(this Form form)
{
bool changed = false;
if (form == null)
return changed;
foreach (Control c in form.Controls)
{
switch (c.GetType().ToString())
{
case "TextBox":
changed = ((TextBox)c).Modified;
break;
//Other control types here...
}
if (changed)
break;
}
return changed;
}
但我不认为这是最好的方法,因为:
有没有更好的方法来实现我的需求?
答案 0 :(得分:0)
您只想检查一次吗?就像关闭窗口之前一样..如果你这样做,你可以
在表单类中声明public static bool changed=false;
,并将其值更改为true
,其中包含INotifyPropertychanged。
您可以在表单中的任何位置显示消息框,如下所示。
if(changed)
{
if (MessageBox.Show("Are you sure?","some caption",MessageBoxButtons.YesNo)==DialogResult.Yes)
{
//Do this if user presses YES
}
}
答案 1 :(得分:0)
只需订阅BindingSource的ListChanged事件,并根据事件设置IsDirty标志。
categoryBindingSource.ListChanged + = new System.ComponentModel.ListChangedEventHandler(categoryBindingSource_ListChanged);
并在事件方法中设置IsDirty = true ...
void customerAccountBindingSource_ListChanged(object sender,system.ComponentModel.ListChangedEventArgs e) { if(e.ListChangedType == System.ComponentModel.ListChangedType.ItemChanged) _isDirty = true;
}
答案 2 :(得分:0)
我意识到这是一个较旧的主题,但我建议一个简单的解决方案:
if (YourTextBox.Modified)
{
// Your code goes here.
}
我认为它自版本1.0以来就存在。您可以找到更多信息here。