DataGrid 获取选定行的列值
Posted
技术标签:
【中文标题】DataGrid 获取选定行的列值【英文标题】:DataGrid get selected rows' column values 【发布时间】: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 的教程和帮助,但我没有使用这个。
【问题讨论】:
根据我的发现,最简单的解决方案:***.com/a/42013760/7103438 【参考方案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#。 我把这个解决方案放在这里,它可能对某人有用。
【讨论】:
以上是关于DataGrid 获取选定行的列值的主要内容,如果未能解决你的问题,请参考以下文章
WPF的DataGrid中如何获取当前被选定的行的第一个单元格的值?