2016-09-19 133 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; 

但在你的情况,我想更多更快的将是移动代码从数据库中获取数据在单独的方法。并用新数据在您要更新窗口的地方调用该方法。