2017-06-04 68 views
0

我需要帮助我的这部分代码。我想在这里做两件事:清除数据绑定的组合框上的数据

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

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

公共无效TechSearch_loaded(对象发件人,EventArgs的)

{

//所有这些3项是所谓清除组合框cmbTechSearch;所有这些失败,但如果我删除1号线我得到一个错误,说有已经被绑定到框中键入一些数据(但只有当我点击第二次)

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

//有一个名为TECNICO和类有关该对象的所有信息都保存在SQL数据库中。这部分用db中的信息填充Tecnicos列表。

 List<Tecnico> tecnicos = new List<Tecnico>(); 
     tecnicos = bd.ProcuraPerfisTipo("TEC"); 

//然后我得到Tecnicos的列表,并检索一个属性(诺姆)每个TECNICO列表

 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数据库和运行更新,查询和插入而第二个用于接口)。这些类都是这种形式的外部。我只是从他们那里得到日期,用我需要的任何信息填充表单。

回答

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.Resources,你把你的dataTemplate您的组合框项目。

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

现在,自我约束的观点,以它的代码隐藏,所以在Window声明添加

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","[email protected]"), 
      new MyDummyUser("User 2","[email protected]"), 
      new MyDummyUser("User 3","[email protected]"), 
      new MyDummyUser("User 4","[email protected]"), 
      new MyDummyUser("User 5","[email protected]"), 
      new MyDummyUser("User 6","[email protected]"), 
     }; 

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

请注意我已经使用了WPF的一个例子,但即使你要使用的WinRT或UWP代码它会工作,只记得切换Window.ResourcesPage.Resources另外,UWP你可以使用x:Bind并使用x:绑定可以帮助你摆脱RelativeResource=self

+0

感谢您的回复。这是很多消化... 我没有忘记提及我正在使用Windows窗体。这有什么区别吗? –

+0

好的。因为在winForms中你没有xaml。所以数据绑定必须以另一种方式完成。因此,对于应用数据绑定使用https://stackoverflow.com/q/2251075/3766231 –

+0

我没有太多的经验与winForms,但我会尽量为你得到一个样本。 –