我编写了一个通过ConnectionString连接到SQL Anywhere数据库的工具。 我想接收一些数据并通过Loaded Event将它们绑定到ComboBox。
private void VesselNoComboBox_Loaded(object sender, RoutedEventArgs e)
{
ListShipNames();
}
/// <summary>
/// Receive all vessels from Database and add them to the combobox.
/// A variable Database connection has to be built.
/// </summary>
private void ListShipNames()
{
SAConnection sqlCon = new SAConnection();
sqlCon.ConnectionString = "Data Source=****; User id=****; Password=****";
try
{
sqlCon.Open();
SACommand cmd = new SACommand("Select ID || ' ' || NAME from test.SHIP_DATA", sqlCon);
SADataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
VesselNoComboBox.Items.Add(reader.GetString(0));
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error ", MessageBoxButton.OK, MessageBoxImage.Exclamation);
}
finally
{
sqlCon.Close();
}
}
/// <summary>
/// Receive all vessels from Database and add them to the combobox.
/// A variable Database connection has to be built.
/// </summary>
private void ListShipNames()
{
SAConnection sqlCon = new SAConnection();
sqlCon.ConnectionString = "Data Source=****; User id=****; Password=****";
try
{
sqlCon.Open();
SACommand cmd = new SACommand("Select ID || ' ' || NAME from test.SHIP_DATA", sqlCon);
SADataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
VesselNoComboBox.Items.Add(reader.GetString(0));
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error ", MessageBoxButton.OK, MessageBoxImage.Exclamation);
}
finally
{
sqlCon.Close();
}
}
在WPF中,第一个ComboBox_Loaded将在启动程序时执行。然后加载UserControl时。这样所有数据都会翻倍。显式将删除ComboBox条目。
有人能给我一个暗示吗?
答案 0 :(得分:0)
如果没有关于您的解决方案的进一步信息,我无法告诉您原因。我可以告诉你,当从模板中加载控件时,可以多次触发加载的事件。这是因为每次将控件包含在可视化树中时都会触发Loaded事件,这可能是Mike Hillberg从MSDN blog发出的原因。
注意: 您可能不知道自己是从模板加载的。例如,选项卡控件将每个选项卡视为模板,在单击选项卡时加载它并在移动时卸载它。 Philipp Sumi描述了问题here。
解决此问题的方法是确保您的数据加载代码不在控件加载事件中。
更多的WPF解决方案是使用数据绑定。而不是加载数据并将其直接添加到控件中。为此,
我希望这会有所帮助。