WPF - 如何在重新组合组合框之前清除项目

时间:2016-10-27 22:51:16

标签: c# wpf combobox

我正在尝试制作级联组合框。当我第一次在组合框中选择值时一切正常,但是当我返回到第一个组合框并更改为其他值时,其他组合中的新项目将附加到旧项目。这是我的代码:

public Apartment()
    {
        InitializeComponent();
    }
    SqlConnection con = new SqlConnection(Connection.cnnDatabase1);
    Database1DataSet ds = new Database1DataSet();

 private void FillLocation()
    {
        //locationCombo.Items.Clear() 
        SqlDataAdapter daLocation= new SqlDataAdapter("select * from Location", con);

        daLocation.Fill(ds, "Location");
        con.Open();
        locationCombo.ItemsSource = ds.Tables["Location"].DefaultView;
        locationCombo.DisplayMemberPath = "Location";
        locationCombo.SelectedValuePath = "IdLocation";
        con.Close();
    }
    private void FillCity(String IdLocation)
    {
        /*cityCombo.Items.Clear() -- I have tried inserting this, 
        but I am getting an error "Operation is not valid while ItemsSource is in use. 
        Access and modify elements with ItemsControl.ItemsSource instead." on that part 
        when I reselect the combo.*/
        SqlDataAdapter daCity= new SqlDataAdapter("select * from City where IdLocation= " + IdLocation, con);

        daCity.Fill(ds, "City");
        con.Open();
        cityCombo.ItemsSource = ds.Tables["City"].DefaultView;
        cityCombo.DisplayMemberPath = "City";
        cityCombo.SelectedValuePath = "IdCity";
        con.Close();
    }
    private void FillStreet(String IdCity)
    {
        //cityCombo.Items.Clear()
        SqlDataAdapter daStreet= new SqlDataAdapter("select * from Street where IdCity= " + IdCity, con);

        daStreet.Fill(ds, "Street");
        con.Open();
        cityCombo.ItemsSource = ds.Tables["Street"].DefaultView;
        cityCombo.DisplayMemberPath = "Street";
        cityCombo.SelectedValuePath = "IdStreet";
        con.Close();
    }

private void Window_Loaded_1(object sender, RoutedEventArgs e)
    {
        FillLocation();
    }

    private void locationCombo_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        String idLocation= locationCombo.SelectedValue.ToString();
        FillCity(idLocation);

    }
    private void cityCombo_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        String idCity = cityCombo.SelectedValue.ToString();
        FillStreet(idCity);

    }

3 个答案:

答案 0 :(得分:2)

试试这个:

public Apartment()
{
    InitializeComponent();
}
SqlConnection con = new SqlConnection(Connection.cnnDatabase1);
Database1DataSet ds = new Database1DataSet();

private void FillLocation()
{
    //locationCombo.Items.Clear() 
    SqlDataAdapter daLocation= new SqlDataAdapter("select * from Location", con);

    ds.Tables["Location"].Clear();

    daLocation.Fill(ds, "Location");
    con.Open();
    locationCombo.ItemsSource = ds.Tables["Location"].DefaultView;
    locationCombo.DisplayMemberPath = "Location";
    locationCombo.SelectedValuePath = "IdLocation";
    con.Close();
}
private void FillCity(String IdLocation)
{
    /*cityCombo.Items.Clear() -- I have tried inserting this, 
    but I am getting an error "Operation is not valid while ItemsSource is in use. 
    Access and modify elements with ItemsControl.ItemsSource instead." on that part 
    when I reselect the combo.*/
    if(!String.IsNullOrWhiteSpace(IdLocation))
    {
        ds.Tables["City"].Clear();
        SqlDataAdapter daCity= new SqlDataAdapter("select * from City where IdLocation= " + IdLocation, con);

        daCity.Fill(ds, "City");
        con.Open();
        cityCombo.ItemsSource = ds.Tables["City"].DefaultView;
        cityCombo.DisplayMemberPath = "City";
        cityCombo.SelectedValuePath = "IdCity";
        con.Close();
    }
}
private void FillStreet(String IdCity)
{
    if(!String.IsNullOrWhiteSpace(IdCity))
    {
        s.Tables["Street"].Clear();
        SqlDataAdapter daStreet= new SqlDataAdapter("select * from Street where IdCity= " + IdCity, con);

        daStreet.Fill(ds, "Street");
        con.Open();
        cityCombo.ItemsSource = ds.Tables["Street"].DefaultView;
        cityCombo.DisplayMemberPath = "Street";
        cityCombo.SelectedValuePath = "IdStreet";
        con.Close();
    }
}

private void Window_Loaded_1(object sender, RoutedEventArgs e)
{
    FillLocation();
}

private void locationCombo_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    if(locationCombo.SelectedValue != null)
    {
        String idLocation= locationCombo.SelectedValue.ToString();
        FillCity(idLocation);
    }

}
private void cityCombo_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    if(cityCombo.SelectedValue != null)
    {
        String idCity = cityCombo.SelectedValue.ToString();
        FillStreet(idCity);
    }
}

答案 1 :(得分:1)

由于cityCombo.Items.Clear()在这种情况下不是代码注释中提到的选项,因此您可以清除数据表:

ds.Tables["City"].Clear();

为了避免NullReferenceException中的cityCombo_SelectionChanged,您可以检查cityCombo.SelectedValue是否为空。

答案 2 :(得分:0)

您正在重复使用DataSet。所以它会继续追加。正如我在评论中所说,要么清除DataSet,要么为每个函数创建一个本地函数。