【发布时间】:2016-12-28 05:15:15
【问题描述】:
来自微软: “当基础列表更改或列表中的项目更改时发生BindingSource.ListChanged 事件”。
但在我的示例中,事件会在每次位置更改时触发。 Form 有一个 UserControl、一个 BindingSource 和一个 Button。
用户控件有一个TextBox和两个属性:
/// <summary>
/// Is working: ListChanged is not fired
/// </summary>
public override string Text
{
get { return textBox1.Text; }
set { textBox1.Text = value; }
}
/// <summary>
/// Is not working: ListChanged is fired on Position changes
/// </summary>
public string MyProperty
{
get { return textBox1.Text; }
set { textBox1.Text = value; }
}
表单上的按钮改变了BindingSource的位置:
void next_Click(object sender, EventArgs e)
{
bindingsource.Position += 1;
}
当我使用“文本”属性绑定控件时,不会发生 ListChanged 事件,正如预期的那样:
myusercontrol1.DataBindings.Add("Text", bindingsource, "name");
但是当我使用“MyProperty”属性绑定控件时,ListChanged 事件会在位置更改时触发:
myusercontrol1.DataBindings.Add("MyProperty", bindingsource, "name");
我尝试了不同的 DataSorces,如下例所示:
public Example()
{
InitializeComponent();
string xml = @"<states>"
+ @"<state><name>Washington</name></state>"
+ @"<state><name>Oregon</name></state>"
+ @"<state><name>Florida</name></state>"
+ @"</states>";
byte[] xmlBytes = Encoding.UTF8.GetBytes(xml);
MemoryStream stream = new MemoryStream(xmlBytes, false);
DataSet set = new DataSet();
set.ReadXml(stream);
bindingsource.DataSource = set;
bindingsource.DataMember = "state";
bindingsource.ListChanged += BindingNavigator_ListChanged;
myusercontrol1.DataBindings.Add("MyProperty", bindingsource, "name");
}
如何使用 MyProperty 并避免在位置更改时触发 ListChanged 事件?为什么 Text 属性按预期工作,而 MyProperty 却没有?
提前致谢, 克里斯蒂安
【问题讨论】:
标签: c# data-binding user-controls