2017-06-04 63 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,但我會盡量爲你得到一個樣本。 –