【问题标题】:WPF DataGrid: How do you iterate in a DataGrid to get rows and columns?WPF DataGrid:如何在 DataGrid 中迭代以获取行和列?
【发布时间】:2026-01-23 07:40:01
【问题描述】:

如何在 WPF DataGrid 的行和列中进行迭代,就像使用 Forms DataGridView in C# 一样?

例如,如果您有 Forms DataGridView,您可以执行以下操作:

for(int i = 0; i < formsDataGrid1.Rows.Count; i++)
{
  MessageBox.Show(formsDataGrid1.Rows[i].ToString());
  for(int j = 0; j < formsDataGrid1.Columns.Count; j++)
     MessageBox.Show(formsDataGrid1.Rows[i].Cells[j].ToString());
}

感谢您的帮助!

**编辑:

我想这样做的原因是用户将使用 DataGrid 在 DataGrid 的第二列中输入某些信息。此外,这个 DataGrid 有多行,我希望能够获取该数据并使用它更新数据库。

【问题讨论】:

    标签: c# wpf datagrid iteration wpftoolkit


    【解决方案1】:

    dg 是您的 XAML DataGrid x:Name

        for (int i = 0; i < dg.Items.Count; i++)
        {
            DataGridRow row = (DataGridRow)dg.ItemContainerGenerator.ContainerFromIndex(i);
                for (int j = 0; j < dg.Columns.Count; j++)
                {
                    TextBlock cellContent = dg.Columns[j].GetCellContent(row) as TextBlock;
                    Console.WriteLine(cellContent.Text);
                }
        }
    

    【讨论】:

      【解决方案2】:

      通常,您不会这样做:您访问的是底层数据源而不是 DataGrid 本身。例如,假设数据源是IEnumerable&lt;Foo&gt;

      foreach(Foo f in foos)
      {
          MessageBox.Show(f.Name);
      }
      

      编辑:

      您不需要显式访问网格的特定单元格:如果网格绑定到对象列表,则当用户编辑网格中的相应单元格时,对象的属性将自动更新。

      带有联系人列表的简单示例:

          public class Contact
          {
              public string FirstName { get; set; }
              public string LastName { get; set; }
              public string Email { get; set; }
          }
          ...
          ObservableCollection<Contact> contacts = new ObservableCollection<Contact>();
          dataGrid.ItemsSource = contacts;
      
          ...
      

      【讨论】:

      • 如何获取 WPF 工具包 Datagrid 的数据源?
      • @ThomasLevesque ,实际上我需要访问网格,因为我有一个 UserControl 是一个特定的列,我需要为该特定列的每个元素附加一个事件,你知道一个好方法去做?谢谢
      • @MBen,您可能可以使用 DataGrid 的 ItemsContainerGenerator 访问特定的 DataGridRow,但我不确定如何检索特定列的内容...
      • @ThomasLevesque 谢谢,我会试试的。否则你会怎么做?我应该避免在我的网格中使用自定义 UserControl 吗?
      • @MBen,有一个解决方案here。我认为您不应该避免它,这取决于您需要做什么......但通常不需要以编程方式访问控件,您通常可以使用绑定、触发器等处理大多数情况
      【解决方案3】:

      尝试使用Grid.Column[x].GetCellContent(Row[y])方法

      【讨论】:

      • 我认为你的意思是 dataGridObject.Columns[x].GetCellContent( ...something... ); 但是你能列举出什么来得到括号中的 something 呢?
      最近更新 更多