2016-09-19 60 views
-1

我已經被告知我的數據表存儲了正在填充組合框的信息,應該是可觀察的集合以使事情變得更容易。我正在使用WPF格式。C# - 將我的數據錶轉換爲ObservableCollection - WPF

我已經試過尋找多個答案,但是我對此很陌生並且已經寫了這麼多的代碼已經不知道如何將我寫入可觀察集合的所有東西都轉換成了,或者它是否值得重寫它會花費的金額。

我的代碼來獲取數據的數據表:

public partial class MainWindow : Window 
    { 

     DataTable dtNotes = new DataTable(); 
     DataTable dtTemplateNotes = new DataTable(); 
     DataTable dtReplaceVariables = new DataTable(); 

     public MainWindow() 
     { 
      InitializeComponent(); 
      WindowStartupLocation = System.Windows.WindowStartupLocation.CenterScreen; 
      DataContext = new TableList(); 

      //Setup connection to server 
      SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(); 
      builder.DataSource = "PRETEND IP"; 
      builder.InitialCatalog = "DiscoverThePlanet"; 
      builder.UserID = "PRETEND USER"; 
      builder.Password = "PRETEND PASS"; 

      string connectionString = builder.ConnectionString; 

      using (SqlConnection conn = new SqlConnection(connectionString)) 
      { 
       conn.Open(); 

       SqlCommand cmdNotes = new SqlCommand("SELECT NoteID, NoteName, Note FROM Notes", conn); 
       SqlCommand cmdTemplateNotes = new SqlCommand("SELECT TemplateNoteID, TemplateNoteName, TemplateNote FROM TemplateNotes", conn); 
       SqlCommand cmdReplaceVariables = new SqlCommand("SELECT ReplaceVariableID, ReplaceVariableName, ReplaceVariableNote FROM ReplaceVariables", conn); 

       SqlDataReader readerNotes = cmdNotes.ExecuteReader(); 

       dtNotes.Columns.Add("NoteID", typeof(string)); 
       dtNotes.Columns.Add("NoteName", typeof(string)); 
       dtNotes.Columns.Add("Note", typeof(string)); 
       dtNotes.Load(readerNotes); 

       SqlDataReader readerTemplateNotes = cmdTemplateNotes.ExecuteReader(); 

       dtTemplateNotes.Columns.Add("TemplateNoteID", typeof(string)); 
       dtTemplateNotes.Columns.Add("TemplateNoteName", typeof(string)); 
       dtTemplateNotes.Columns.Add("TemplateNote", typeof(string)); 
       dtTemplateNotes.Load(readerTemplateNotes); 

       SqlDataReader readerReplaceVariables = cmdReplaceVariables.ExecuteReader(); 

       dtReplaceVariables.Columns.Add("ReplaceVariableID", typeof(string)); 
       dtReplaceVariables.Columns.Add("ReplaceVariableName", typeof(string)); 
       dtReplaceVariables.Columns.Add("ReplaceVariableNote", typeof(string)); 
       dtReplaceVariables.Load(readerReplaceVariables); 

       // Temporary loop to see if the DataTable (dt) has any data?!? 
       //foreach (DataRow thisRow in dt.Rows) 
       //{ 
       // MessageBox.Show(thisRow["NoteName"].ToString()); 
       //} 


       // Define the columns BEFORE setting the item source 
       noteNamesList.SelectedValuePath = "NoteID"; 
       noteNamesList.DisplayMemberPath = "NoteName"; 

       templateNoteNamesList.SelectedValuePath = "TemplateNoteID"; 
       templateNoteNamesList.DisplayMemberPath = "TemplateNoteName"; 

       replaceVariableNoteList.SelectedValuePath = "ReplaceVariableID"; 
       replaceVariableNoteList.DisplayMemberPath = "ReplaceVariableName"; 


       // Set the ItemSource to my fully loaded data table! 
       noteNamesList.ItemsSource = dtNotes.DefaultView; 
       templateNoteNamesList.ItemsSource = dtTemplateNotes.DefaultView; 
       replaceVariableNoteList.ItemsSource = dtReplaceVariables.DefaultView; 

       //DEBUG START 
       //MessageBox.Show("Hello"); 
       //DEBUG END 

       conn.Close(); 
      } 
     } 

本主題出來時,我提到了我需要刷新這些數據表的命令後跑(更新表),然後在爲了刷新組合框和來自我的SQL數據庫的最新數據,我必須重新啓動我的應用程序。

那時有人建議我將這些數據表更改爲ObservableCollections。

如果您需要更多信息,請直接詢問,即時通訊。

+0

不明確給出一個確切的明確要求 –

+0

我想從我的SQL數據庫來的信息填充到ObservableCollections中,而不是隻填充DataTables,然後給他們一個項目源 –

+0

因爲你可以使另一個類與你需要得到的字段名稱,然後在一個obserbalecollection內部調用該類名稱即obserablecollection anc- = new obserablecollection(); –

回答

2

ObservableCollection只是一些類型的項目的集合。
首先,你需要創建一個類項目:

public class MyNote 
{ 
    public string Id { get; set; } 
    public string Name { get; set; } 
} 

然後你可以使用它:

var notes = new ObservableCollection(); 
using(DataReader reader = cmdNotes.ExecuteReader()) 
{ 
    var ordinals = new 
    { 
     Id = reader.GetOrdinal("NoteID"), 
     Name = reader.GetOrdinal("NoteName") 
    } 

    while(reader.Read() == true) 
    { 
     var temp = new Note(); 
     temp.Id = reader.GetString(ordinals.Id); 
     temp.Name = reader.GetString(ordinals.Name); 

     notes.Add(temp); 
    } 
} 


noteNamesList.SelectedValuePath = "Id"; 
noteNamesList.DisplayMemberPath = "Name"; 
noteNamesList.ItemsSource = notes; 

但在你的情況,我想更多更快的將是移動代碼從數據庫中獲取數據在單獨的方法。並用新數據在您要更新窗口的地方調用該方法。