清除数据绑定的组合框上的数据

时间:2017-06-04 16:50:21

标签: c# list object combobox

我需要帮助我的这部分代码。我想在这里做两件事:

第一,我需要我的comboBox cmbTechSearch填充从SQL数据库中检索的名称列表。这些名称属于名为Tecnico的对象。 到现在为止还挺好。但是,如果我两次点击comboBox,我会得到重复的名称......依此类推。 添加cmbTechSearch.Items.Clear();没有解决它,因为该框是数据绑定,触发错误消息。所以我添加了cmbTechSearch.DataSource = null;这解决了错误信息但没有清除我的方框。也没有cmbTechSearch.ResetText(); 现在我不确定如何清除它,以便在我再次点击该框时数据不会重复。

第二,从SQL数据库中检索的列表带来的不仅仅是附加的名称。它也为每个对象带来了一封电子邮件。我无法弄清楚如何检索与该comboBox上所选名称相关联的邮件。 请注意,电子邮件是全局字符串var,因为我在代码中的其他方法中使用它。该部分被评论,因为它不起作用。

public void TechSearch_loaded(object sender,EventArgs e)

{

//所有这3个条目都应该清除comboBox cmbTechSearch;所有这些都失败但是如果我删除了第一行我得到一个错误,说已经有一些数据绑定到该框(但只有当我点击第二次)

        cmbTechSearch.DataSource = null;
        cmbTechSearch.Items.Clear();
        cmbTechSearch.ResetText();

//有一个名为Tecnico的类,有关该对象的所有信息都保存在SQL数据库中。此部分使用db。

中的信息填充Tecnicos列表
        List<Tecnico> tecnicos = new List<Tecnico>();
        tecnicos = bd.ProcuraPerfisTipo("TEC");

//然后我得到一个Tecnicos列表并为列表中的每个tecnico检索一个属性(Nome)

        List<String> TechSearch = new List<String>();

        foreach (Tecnico obj in tecnicos)
        {
            TechSearch.Add(obj.Nome);
        }

//最后我使用从列表中获取的信息填充comboBox。

        cmbTechSearch.DataSource = TechSearch;

        //email = cmbTechSearch.ToString();
    }

有一个名为Tecnico的类,另一个名为BDTicketSQL,另一个名为iBDTicketSQL(第一个调用SQL db并运行更新,查询和插入,而第二个用于接口)。这些类都是这种形式的外部。我只是从他们那里得到日期,用我需要的任何信息填充表格。

1 个答案:

答案 0 :(得分:0)

好吧,你需要减少你的努力DataBinding。既然你已经在你的问题中提到过数据绑定,我会假设你知道它。所以我会快速完成答案。此外,由于您没有提到任何平台,我认为它是WPF,但如果您愿意,可以将代码复制到WinRT或UWP。只是想要它是一个不同的平台,请在评论部分Link to full solution In case you wana skip

告诉我

你的XAML: 我已经使用基本绑定到代码隐藏来避免样本的很多类。下面是代码:

<StackPanel Margin="20">
    <ComboBox x:Name="UserCombobox"
              Height="20"
              Width="300"
              ItemsSource="{Binding DataFromSQLService,Mode=OneWay}"
              SelectedItem="{Binding CurrentSelectedUser,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
              ItemTemplate="{StaticResource UserDataTemplate}"
              SelectionChanged="UserCombobox_SelectionChanged"/>

    <Button Content="Clear Combo" Height="30" Width="100" Margin="10" Click="ClearData"/>

    <Button Content="Load Combo" Height="30" Width="100" Margin="10" Click="LoadData"/>

    <TextBlock Text="{Binding CurrentSelectedUser.Name,Mode=OneWay}" HorizontalAlignment="Center"/>

    <TextBlock Text="{Binding CurrentSelectedUser.Email,Mode=OneWay}" HorizontalAlignment="Center"/>

</StackPanel>

现在,您的Window.ResourcesdataTemplate放在您的组合框项目中。

 <Window.Resources>
    <DataTemplate x:Key="UserDataTemplate">
        <StackPanel>
            <TextBlock Text="{Binding Name}"/>
        </StackPanel>
    </DataTemplate>
</Window.Resources>

现在,将视图自我绑定到它的代码隐藏,因此在Window Declaration中添加

DataContext = "{Binding RelativeSource={RelativeSource Self}}"

现在视图已准备就绪,让我们快速准备好我们的代码。

虚拟用户类您可以将其替换为您的模型类。

public class MyDummyUser
{
    public MyDummyUser(string name, string email)
    {
        Name = name;
        Email = email;
    }

    public string Name { get; set; }

    public string Email { get; set; }
}

现在创建一个快速属性来保留当前选定的用户。

  private MyDummyUser currentSelectedUser;

  public MyDummyUser CurrentSelectedUser
    {
        get { return currentSelectedUser; }
        set { currentSelectedUser = value; RaisePropertyChanged(nameof(CurrentSelectedUser)); }
    }

现在创建一个可观察的集合来保存SQL服务中的数据:

private ObservableCollection<MyDummyUser> dataFromSQLService;
    public ObservableCollection<MyDummyUser> DataFromSQLService
    {
        get { return dataFromSQLService; }
        set { dataFromSQLService = value; RaisePropertyChanged(nameof(DataFromSQLService)); }
    }

现在实施INotifyPropertyChanged

public event PropertyChangedEventHandler PropertyChanged;
    public void RaisePropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
    //if using c# 6.0 or later replace the above with
    //public void RaisePropertyChanged(string propertyName)=>
    //        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

现在为combobox.SelectionChanged事件添加一个侦听器,以便您知道所选用户何时更改:

 private void UserCombobox_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
    {
        if (CurrentSelectedUser != null && !string.IsNullOrEmpty(CurrentSelectedUser?.Email?.Trim()))
        {
            //perform what you wana do with the email.
        }
    }

创建两个方法:LoadData和ClearData。

 private void ClearData(object sender, RoutedEventArgs e)
    {
        DataFromSQLService = null;
    }

    private void LoadData(object sender, RoutedEventArgs e)
    {
        List<MyDummyUser> someData = new List<MyDummyUser>()
        {
            new MyDummyUser("User 1","User1@gmail.com"),
            new MyDummyUser("User 2","User2@gmail.com"),
            new MyDummyUser("User 3","User3@gmail.com"),
            new MyDummyUser("User 4","User4@gmail.com"),
            new MyDummyUser("User 5","User5@gmail.com"),
            new MyDummyUser("User 6","User6@gmail.com"),
        };

        DataFromSQLService = new ObservableCollection<MyDummyUser>(someData);
    }

请注意我使用了WPF的示例,但即使您想使用WinRT或UWP的代码也能正常工作,请记住切换{{1同时使用Window.Resources,在UWP中,您可以使用Page.Resources并使用x:Bind可以帮助您摆脱x:Bind

相关问题