【问题标题】:Clearing data on a comboBox that's data bound清除数据绑定的组合框上的数据
【发布时间】:2017-06-04 16:50:21
【问题描述】:

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

第一,我需要我的组合框 cmbTechSearch 填充从 SQL 数据库中检索到的名称列表。这些名称属于一个名为 Tecnico 的对象。 到目前为止,一切都很好。但是,如果我单击组合框两次,我会得到重复的名称......等等。 添加 cmbTechSearch.Items.Clear();没有解决它,因为盒子是数据绑定的,会发出错误消息。所以我添加了 cmbTechSearch.DataSource = null;解决了错误消息,但没有清除我的框。 cmbTechSearch.ResetText(); 也没有。 现在我不确定如何清除它,以免再次单击该框时数据不会重复。

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

public void TechSearch_loaded(object sender, EventArgs e)

{

//所有这三个条目都应该清除组合框 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);
        }

//最后我用从列表中获得的信息填充组合框。

        cmbTechSearch.DataSource = TechSearch;

        //email = cmbTechSearch.ToString();
    }

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

【问题讨论】:

    标签: c# list object combobox


    【解决方案1】:

    好的,所以你需要减少工作量的是DataBinding。既然您在问题中提到了数据绑定,我假设您知道这一点。因此,我将快速浏览答案。此外,由于您没有提到任何平台,我认为它是WPF,但如果您愿意,可以将代码复制到 WinRT 或 UWP。万一它是一个不同的平台,请在 cmets 部分告诉我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.Resources 将您的dataTemplate 放在您的组合框项目中。

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

    现在,将视图自我绑定到它的代码隐藏,所以在窗口声明中添加

    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 的代码,它也可以使用,只需记住将 Window.Resources 切换为 @ 987654340@ 同样,在 UWP 中你可以使用 x:Bind 并且使用 x:Bind 可以帮助你摆脱 RelativeResource=self

    【讨论】:

    • 感谢您的回复。这需要消化很多...我确实忘记提及我正在使用 Windows 窗体。这有什么区别吗?
    • 嗯,是的。因为在 winForms 中你没有 xaml。所以数据绑定将不得不以另一种方式完成。所以为了应用数据绑定使用stackoverflow.com/q/2251075/3766231
    • 我对 winForms 没有太多经验,但我会尝试为您获取示例。
    • 哦。对不起。我应该在我的原始帖子中提到这一点。问题是我的数据运行良好。我最紧迫的问题是清除组合框的内容,因为它不断添加相同的数据。
    • 你能再分享一些代码吗?我什至无法弄清楚你的代码在做什么。有样品可以看吗?
    猜你喜欢
    • 2010-11-22
    • 1970-01-01
    • 2016-05-02
    • 2012-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多