【发布时间】:2016-09-19 12:20:16
【问题描述】:
有人告诉我,存储填充组合框的信息的数据表应该是可观察的集合,以使事情变得更容易。我使用的是 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。
如果您需要更多信息,请直接询问,我是新手。
【问题讨论】:
-
不清楚给出确切的明确要求
-
我希望将来自我的 SQL 数据库的信息填充到 ObservableCollections 中,而不是仅仅填充 DataTables 然后只给它们一个项目源
-
为此,您可以使用您需要获取的字段名称创建另一个类,然后在 obserbalecollection 中调用该类名称。即, obserablecollection
anc-= new obserablecollection(); -
exg 是您需要的必填字段名的类的名称
-
@LukeLitherland,
ObservableCollection本身无助于与数据库同步。您可以在必要时重新加载所有数据(重复选择查询),而不仅仅是在创建窗口时的 .ctor 中