【问题标题】:C# WPF Appending DataGridC# WPF 附加数据网格
【发布时间】:2020-12-19 03:46:34
【问题描述】:

我似乎只能让它添加第一行,然后它就停止了。我想基本上将它用作保存程序历史记录的一种方式。因此,每次单击按钮时,都会添加一个新行。显然,该代码将添加除时间戳之外的静态信息。

谢谢!!

      private void test_Click(object sender, RoutedEventArgs e)
    {

        {
            InitializeComponent();

            string nowtime = DateTime.Now.ToString("MM/dd/yyyy HH:mm");

            List<User> users = new List<User>();
            users.Add(new User() { ID = "1", Query = "John Doe", Timestamp = nowtime });

            historyData.ItemsSource = users;
        }
    }

    public class User
    {
        public string ID { get; set; }
        public string Query { get; set; }
        public string Timestamp { get; set; }
    }

【问题讨论】:

    标签: c# wpf datagrid append


    【解决方案1】:

    要么将新项目直接添加到Items 属性:

    private void test_Click(object sender, RoutedEventArgs e)
    {
        string nowtime = DateTime.Now.ToString("MM/dd/yyyy HH:mm");
        historyData.Items.Add(new User() { ID = "1", Query = "John Doe", Timestamp = nowtime });
    }
    

    或者设置ItemsSource一次并保留对源集合的引用:

    private readonly ObservableCollection<User> _users = new ObservableCollection<User>();
    
    public MainWindow()
    {
        InitializeComponent();
        historyData.ItemsSource = _users;
    }
    
    private void test_Click(object sender, RoutedEventArgs e)
    {
        string nowtime = DateTime.Now.ToString("MM/dd/yyyy HH:mm");
        _users.Add(new User() { ID = "1", Query = "John Doe", Timestamp = nowtime });
    }
    

    您需要使用ObservableCollection&lt;T&gt;,以便在添加新项目时通知控件。

    【讨论】:

      【解决方案2】:

      贴出的代码有一些问题:

      1. 每次触发 click 事件时,您都会创建一个新列表,并将这个新列表设置为 ItemsSource。这就是为什么网格中只有一行的原因

      2. 您在 click 事件中不必要地调用 InitializeComponets。这属于构造函数。

      3. 对网格的 ItemsSource 使用 ObservableCollection 而不是 List。这将消除每次发生更改时不断分配新列表的需要。

      更改将如下所示:

      private readonly ObservableCollection<User> users = new ObservableCollection<User>();
      
      ....
      
      public Form1()
      {
          InitializeComponets ();
          ....
          historyData.ItemsSource = users;
      }
      
      ....
      
      private void test_Click(object sender, RoutedEventArgs e)
      {
          string nowtime = DateTime.Now.ToString("MM/dd/yyyy HH:mm");
      
          users.Add(new User() { ID = "1", Query = "John Doe", Timestamp = nowtime });
      }
      

      【讨论】:

        【解决方案3】:

        在按钮之外设置这个点击 List&lt;User&gt; users = new List&lt;User&gt;();

        在您的按钮上,

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            string nowtime = DateTime.Now.ToString("MM/dd/yyyy HH:mm:ss");
        
            users.Add(new User() { ID = "1", Query = "John Doe", Timestamp = nowtime });
        
            // To refresh datagrid source set null first then the data.
            historyData.ItemsSource = null;
            historyData.ItemsSource = users;
        }
        

        【讨论】:

          猜你喜欢
          • 2017-06-16
          • 1970-01-01
          • 1970-01-01
          • 2010-11-17
          • 1970-01-01
          • 2023-03-06
          • 2011-08-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多