C# - ComboBox中的双倍数据(SQLAnywhere连接)

时间:2014-11-03 17:59:55

标签: c# wpf combobox wpf-controls sqlanywhere

我编写了一个通过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条目。 有人能给我一个暗示吗?

1 个答案:

答案 0 :(得分:0)

如果没有关于您的解决方案的进一步信息,我无法告诉您原因。我可以告诉你,当从模板中加载控件时,可以多次触发加载的事件。这是因为每次将控件包含在可视化树中时都会触发Loaded事件,这可能是Mike Hillberg从MSDN blog发出的原因。

注意: 您可能不知道自己是从模板加载的。例如,选项卡控件将每个选项卡视为模板,在单击选项卡时加载它并在移动时卸载它。 Philipp Sumi描述了问题here

解决此问题的方法是确保您的数据加载代码不在控件加载事件中。

更多的WPF解决方案是使用数据绑定。而不是加载数据并将其直接添加到控件中。为此,

  1. 为您的视图模型设置数据上下文。
  2. 填充ObservableCollection,可能在ViewModel的构造函数中。
  3. 将组合框的ItemsSource属性绑定到集合。
  4. 我希望这会有所帮助。