【问题标题】:DataGrid get selected rows' column valuesDataGrid 获取选定行的列值
【发布时间】:2011-07-04 12:27:36
【问题描述】:

我正在尝试获取 DataGrid 中选定行的每一列的值。这就是我所拥有的:

private void dataGrid1_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
{
    DataGrid dg = sender as DataGrid;
    Console.WriteLine(dg.SelectedCells[0].ToString());
}

但这不起作用。如果我执行SelectedCells.Count,那么我会得到正确的列数,但我似乎无法真正获得所选行中这些列的值。我已经尝试了很长一段时间没有运气!这是我的 XAML:

<Grid>
    <DataGrid CanUserAddRows="True" AutoGenerateColumns="False" Height="200" HorizontalAlignment="Stretch" Margin="12,12,79,0" Name="dataGrid1" VerticalAlignment="Top" Width="389" DataContext="{Binding}" CanUserResizeColumns="False" CanUserResizeRows="False" HorizontalContentAlignment="Stretch" PreviewMouseDoubleClick="dataGrid1_PreviewMouseDoubleClick" CellEditEnding="dataGrid1_CellEditEnding">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding  Path=UserID}"
                                Header="User ID" Width="SizeToHeader" />
            <DataGridTextColumn Binding="{Binding  Path=UserName}"
                                Header="User ID" Width="SizeToHeader" />
        </DataGrid.Columns>
    </DataGrid>
</Grid>

理想情况下,我希望通过rowData.UserID 之类的操作来访问数据,但我似乎无法解决。有很多关于使用 DataGridView 的教程和帮助,但我没有使用这个。

【问题讨论】:

标签: c# .net wpf datagrid


【解决方案1】:

更新

要获取选定的行,请尝试:

IList rows = dg.SelectedItems;

然后您应该能够从行项目中获取列值。

DataRowView row = (DataRowView)dg.SelectedItems[0];

然后:

row["ColumnName"];

【讨论】:

  • 我应该提到这是 WPF,似乎没有 SelectedRows/SelectedRow
  • 第二个选项给了我:无法将“iAdvert_Desktop.User”类型的对象转换为“System.Data.DataRowView”,我也无法让第一个选项工作:/。我对 C# 很陌生。
  • 您可以将 DataRowView 更改为 User。看看是不是这样。我不确定你的物品是什么类型的。
  • 除了给 row["columnName"] 你还可以给 row[0] 等等。谢谢
  • 可以,但我不推荐。当有人稍后出现并添加一列时,索引会中断,您现在正在引用不同的字段。这可能会以独特,隐藏和特殊的方式破坏......如果有人更改列名或将其删除,至少使用列名,应用程序至少会提前明显地出错。支持评论,因为它是一个选项。
【解决方案2】:

我认为没有直接的属性来访问 WPF DataGrid 的选定 的原因是因为 DataGrid 的选择模式可以设置为行级别或单元格级别。因此,与选择相关的属性和事件都是针对单元格级别的选择编写的 - 无论网格的选择模式如何,您都将始终选择 cells,但不能保证您选择了 行。

我不确切知道您通过处理 CellEditEnding 事件想要实现什么,但是要在您选择一行时获取所有选定单元格的值,请查看处理 SelectedCellsChanged event,而不是。特别注意那篇文章中的注释:

你可以处理 SelectedCellsChanged 事件 收集时通知 选定的单元格被更改。如果 选择包括整行, Selector.SelectionChanged 事件是 也提出来了。

您可以检索 AdditionalCells 和 从 SelectedCellsChangedEventArgs 中的 事件处理程序。

希望这有助于您走上正轨。 :)

【讨论】:

  • 好吧,这段代码的想法是允许我:点击编辑用户名,然后在结束编辑时,我想根据用户的 UserID 保存值,即 ReadOnly .所以我需要获取一行的所有单元格(好吧,在这种情况下只有 UserID 和 UserName)。
【解决方案3】:

我做了类似的事情,但我使用绑定来获取所选项目:

<DataGrid Grid.Row="1" AutoGenerateColumns="False" Name="dataGrid"
          IsReadOnly="True" SelectionMode="Single"
          ItemsSource="{Binding ObservableContactList}" 
          SelectedItem="{Binding SelectedContact}">
  <DataGrid.Columns>
    <DataGridTextColumn Binding="{Binding Path=Name}" Header="Name"/>
    <DataGridTextColumn Binding="{Binding Path=FamilyName}" Header="FamilyName"/>
    <DataGridTextColumn Binding="{Binding Path=Age}" Header="Age"/>
    <DataGridTextColumn Binding="{Binding Path=Relation}" Header="Relation"/>
    <DataGridTextColumn Binding="{Binding Path=Phone.Display}" Header="Phone"/>
    <DataGridTextColumn Binding="{Binding Path=Address.Display}" Header="Addr"/>
    <DataGridTextColumn Binding="{Binding Path=Mail}" Header="E-mail"/>
  </DataGrid.Columns>
</DataGrid>

所以我可以在我的 ViewModel 中访问我的 SelectedContact.Name。

【讨论】:

    【解决方案4】:

    基于 Tonys 答案的解决方案:

            DataGrid dg = sender as DataGrid;
            User row = (User)dg.SelectedItems[0];
            Console.WriteLine(row.UserID);
    

    【讨论】:

    • 老问题,但我将 SelectedItems[0] 更改为 SelectedItem... 但这对我有很大帮助! :) 点赞!
    【解决方案5】:

    一种简单有效的方法:

    private void dataGrid_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e)
    {
        foreach (var item in e.AddedCells)
        {
            var col = item.Column as DataGridColumn;
            var fc = col.GetCellContent(item.Item);
    
            if (fc is CheckBox)
            {
                Debug.WriteLine("Values" + (fc as CheckBox).IsChecked);
            }
            else if(fc is TextBlock)
            {
                Debug.WriteLine("Values" + (fc as TextBlock).Text);
            }
            //// Like this for all available types of cells
        }
    }
    

    【讨论】:

    • 我想如果你的每个单元格中都有一个 CheckBox 就可以了。当然在无数种情况下不要...
    【解决方案6】:

    经过数小时寻找如何从 WPF DataGrid 控件上选择的行中获取数据的方法,就像我使用 MongoDB 一样。我找到了这篇文章并使用了托尼的答案。我修改了代码以与我的项目相关。也许有人可以用它来获得一个想法。

    private void selectionChanged(object sender, SelectionChangedEventArgs e)
        {
            facultyData row = (facultyData)facultyDataGrid.SelectedItem;
            facultyID_Textbox.Text = row.facultyID;
            lastName_TextBox.Text = row.lastName;
            firstName_TextBox.Text = row.firstName;
            middleName_TextBox.Text = row.middleName;
            age_TextBox.Text = row.age.ToString();
        }
    
    }
    
    class facultyData
    {
        public ObjectId _id { get; set; }
        public string facultyID { get; set; }
        public string acadYear { get; set; }
        public string program { get; set; }   
    }
    

    【讨论】:

      【解决方案7】:

      DataGrid 获取选定行的列值,可以通过以下代码访问。这里 grid1 是网格的名称。

      private void Edit_Click(object sender, RoutedEventArgs e)
      {
          DataRowView rowview = grid1.SelectedItem as DataRowView;
          string id = rowview.Row[0].ToString();
      }
      

      【讨论】:

      • 可能是最简单的方法,你也可以通过列名来调用它 string id = rowview.Row["Id"].ToString();
      【解决方案8】:

      我使用类似的方法使用animescm sugestion解决了这个问题,实际上我们可以使用辅助列表从一组选定的单元格中获取特定的单元格值:

      private void dataGridCase_SelectionChanged(object sender, SelectedCellsChangedEventArgs e)
          {
              foreach (var item in e.AddedCells)
              {
                  var col = item.Column as DataGridColumn;
                  var fc = col.GetCellContent(item.Item);
                  lstTxns.Items.Add((fc as TextBlock).Text);
              }
          }
      

      【讨论】:

      • 什么是lstTxns.Items.Add
      【解决方案9】:

      如果您使用 SQL 查询来填充 DataGrid,您可以这样做:

      数据网格填充

      Private Sub UserControl_Loaded(sender As Object, e As RoutedEventArgs)
              Dim cmd As SqlCommand
              Dim da As SqlDataAdapter
              Dim dt As DataTable
      
              cmd = New SqlCommand With {
                  .CommandText = "SELECT * FROM temp_rech_dossier_route",
                  .Connection = connSQLServer
              }
              da = New SqlDataAdapter(cmd)
              dt = New DataTable("RECH")
              da.Fill(dt)
              DataGridRech.ItemsSource = dt.DefaultView
      End Sub
      

      价值展示

          Private Sub DataGridRech_SelectionChanged(sender As Object, e As SelectionChangedEventArgs) Handles DataGridRech.SelectionChanged
              Dim val As DataRowView
              val = CType(DataGridRech.SelectedItem, DataRowView)
              Console.WriteLine(val.Row.Item("num_dos"))
          End Sub
      

      我知道它在 VB.Net 中,但可以翻译成 C#。 我把这个解决方案放在这里,它可能对某人有用。

      【讨论】:

        猜你喜欢
        • 2012-11-11
        • 2016-10-13
        • 2016-08-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-22
        相关资源
        最近更新 更多