2011-02-25 120 views
28

我想要获取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的帮助,但我没有使用它。

+0

WPF,更新标签。 – Prisoner 2011-02-25 18:56:40

+0

根据我的研究结果,最简单的解决方案:http://stackoverflow.com/a/42013760/7103438 – 2017-02-02 22:51:33

回答

51

修订

要获得所选行尝试:

IList rows = dg.SelectedItems; 

然后,您应该能够得到从行项目的列值。

OR

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

然后:

row["ColumnName"]; 
+0

我应该提到这是WPF,似乎并没有SelectedRows/SelectedRow – Prisoner 2011-02-25 18:57:55

+0

第二个选项给我︰无法为了输入'iAdvert_Desktop.User'类型的对象来键入'System.Data.DataRowView',并且我无法得到第一个选项:/。我对C#很陌生。 – Prisoner 2011-02-25 19:07:34

+0

您可以将DataRowView更改为用户。看看是否有这样做。我不确定你的物品是什么类型。 – 2011-02-25 19:19:27

2

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

我并不确切知道您通过处理CellEditEnding事件来实现的目标,但是当您选择一行时获取所有选定单元格的值,请参阅处理SelectedCellsChanged event,而不是。特别要注意的是文章中的言论:

您可以处理 SelectedCellsChanged事件是 通知时 选定单元格的集合更改。如果 选择包含完整行,则也会引发 Selector.SelectionChanged事件 。

您可以检索从 事件处理 SelectedCellsChangedEventArgs的AddedCells和 RemovedCells。

希望能帮助你走上正轨。 :)

+0

那么,这段代码的想法是让我:点击编辑用户名,然后在编辑结束时,我想根据用户的用户名ReadOnly保存值。所以我需要获取一行的所有单元格(以及在此实例中只有UserID和UserName)。 – Prisoner 2011-02-25 19:11:09

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> 

所以我可以访问我的SelectedContact.Name在我的视图模型。

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

解决方案,因为我使用的是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; } 
} 
+1

老问题,但我改变SelectedItems [0] SelectedItem ...但这帮助了我很多! :) upvote! – Arrie 2015-03-05 10:21:25

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

我想这很好,如果你在每个单元格中都有一个复选框。当然在无数的情况下不要...... – ouflak 2013-10-24 09:23:10

1

后发现如何从一个WPF DataGrid控件选择的行获取数据方式的时间根据东尼斯回答

1

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

private void Edit_Click(object sender, RoutedEventArgs e) 
{ 
    DataRowView rowview = grid1.SelectedItem as DataRowView; 
    string id = rowview.Row[0].ToString(); 
} 
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); 
     } 
    }