【问题标题】:C# - Converting my Data tables to ObservableCollection - WPFC# - 将我的数据表转换为 ObservableCollection - WPF
【发布时间】: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 中

标签: c# sql wpf


【解决方案1】:

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;

但在您的情况下,我认为移动以单独方法从数据库获取数据的代码会更快。并在您想用新数据更新窗口的地方调用该方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-02
    • 2012-07-28
    • 2018-04-19
    • 1970-01-01
    • 1970-01-01
    • 2016-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多