DataGrid获取选定行的列值

时间:2011-02-25 18:35:07

标签: c# .net wpf datagrid

我正在尝试获取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的教程和帮助,但我没有使用它。

9 个答案:

答案 0 :(得分:60)

<强>已更新

要获取所选行,请尝试:

IList rows = dg.SelectedItems;

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

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

然后:

row["ColumnName"];

答案 1 :(得分:7)

基于Tonys回答的解决方案:

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

答案 2 :(得分:6)

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

<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。

答案 3 :(得分:2)

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

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

  

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

     

您可以检索已添加的细胞和   删除了来自的细胞   SelectedCellsChangedEventArgs中的   事件处理程序。

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

答案 4 :(得分:1)

一种简单的方法:

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
    }
}

答案 5 :(得分:1)

在找到如何从WPF DataGrid控件上选择的行中获取数据的方法之后,我正在使用MongoDB。我发现这篇文章并使用了Tony的答案。我将代码修改为与我的项目相关。也许有人可以用它来获得一个想法。

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; }   
}

答案 6 :(得分:1)

DataGrid获取选定行的列值,可以通过以下代码访问它们。这里grid1是Gride的名字。

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

答案 7 :(得分:0)

我使用类似的方法使用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);
        }
    }

答案 8 :(得分:0)

如果您使用 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#。 我把这个解决方案放在这里,它可能对某人有用。