当用户更改PropertyGrid中的text或bool值时,我在事件处理程序中设置了flagModified=true;
:
private void propertyGrid1_PropertyValueChanged(object s, PropertyValueChangedEventArgs e)
{
propertyGrid1.Refresh();
PropertyChanged(true);
}
然后启用“保存”按钮。
我使用我的编辑器和表单(请参阅下面的类)来编辑Properrtygrid中的一个值。这是我班上的对象。 在编辑器和编辑器关闭后更改对象后,我将对象的值重新赋值给新值(value = frm.m_DS;)。一切正常,但有一刻:在这种情况下,不会引发PropertyValueChanged。 我使用PropertyValueChanged事件来启用我的按钮“保存”,它将所有属性保存到文件。 如何捕获值已更改的事件并启用“保存”按钮?。
public class DataProviderEditor : UITypeEditor
{
public override Object EditValue(
ITypeDescriptorContext context,
IServiceProvider provider,
Object value)
{
if ((context != null) && (provider != null))
{
IWindowsFormsEditorService svc =
(IWindowsFormsEditorService)
provider.GetService(typeof(IWindowsFormsEditorService));
if (svc != null)
{
using (DatasourceForm frm =
new DatasourceForm((MyDatasource)value))
{
if (svc.ShowDialog(frm) == DialogResult.OK)
{
value = frm.m_DS;
}
}
}
}
return base.EditValue(context, provider, value);
}
答案 0 :(得分:3)
我注意到有关事件PropertyGrid.PropertyValueChanged
的文档存在缺陷。它没有提到只有在用户更改值时才会引发事件。如果您查看PropertyValueChangedEventArgs
文档,可以找到以下内容:
当用户在PropertyGrid中更改属性(指定为GridItem)的值时,会发生PropertyValueChanged事件。
您可以做的是将PropertyValueChanged
事件添加到PropertyGrid
浏览的对象中。您可以将其编码为类似于:
public class BrowsedObject
{
public event EventHandler PropertyValueChanged;
private void OnPropertyValueChanged(object sender, EventArgs e)
{
EventHandler eh = PropertyValueChanged;
if (eh != null)
eh(sender, e);
}
private string someProperty;
public new string SomeProperty
{
get { return someProperty; }
set
{
someProperty = value;
OnPropertyValueChanged(this, EventArgs.Empty);
}
}
}
每次为SomeProperty
分配新值时,对象都会引发PropertyValueChanged
。您可以连接到此事件逻辑,以启用保存按钮等。
或强>
为什么不在每次从代码中更改对象属性时调用PropertyChanged(true);
。
答案 1 :(得分:0)
对于一个非常简单的“自动更新”工作人员,您可以这样做:
propertyGrid1.SelectedObject = propertyGrid1.SelectedObject;
似乎它有效,变化是可见的。