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 ответов
ОБНОВЛЕНО
Чтобы получить выбранные строки, попробуйте:
IList rows = dg.SelectedItems;
После этого вы сможете получить значение столбца из элемента строки.
ИЛИ ЖЕ
DataRowView row = (DataRowView)dg.SelectedItems[0];
Затем:
row["ColumnName"];
Решение на основе ответа Tonys:
DataGrid dg = sender as DataGrid;
User row = (User)dg.SelectedItems[0];
Console.WriteLine(row.UserID);
Я сделал нечто подобное, но я использую привязку, чтобы получить выбранный элемент:
<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 в моей ViewModel.
DataGrid получает значения столбцов выбранных строк, к которым можно получить доступ с помощью кода ниже. Здесь grid1 - это имя Gride.
private void Edit_Click(object sender, RoutedEventArgs e)
{
DataRowView rowview = grid1.SelectedItem as DataRowView;
string id = rowview.Row[0].ToString();
}
После нескольких часов поиска путей получения данных из строки, выбранной в элементе управления WPG 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; }
}
Я полагаю, что причина отсутствия простого свойства для доступа к выбранной строке WPF DataGrid заключается в том, что режим выбора DataGrid может быть установлен либо на уровне строк, либо на уровне ячеек. Следовательно, все свойства и события, связанные с выбором, записываются на основе выбора на уровне ячеек - у вас всегда будут выделенные ячейки независимо от режима выбора сетки, но у вас не будет гарантированно выбранной строки.
Я не знаю точно, чего вы пытаетесь достичь, обрабатывая событие CellEditEnding, но чтобы получить значения всех выбранных ячеек при выборе строки, обратите внимание на обработку события SelectedCellsChanged. Особенно обратите внимание на замечания в этой статье:
Вы можете обработать событие SelectedCellsChanged, чтобы получать уведомления при изменении коллекции выбранных ячеек. Если выбор включает в себя полные строки, событие Selector.SelectionChanged также возникает.
Вы можете извлечь AddedCells и RemovedCells из SelectedCellsChangedEventArgs в обработчике событий.
Надеюсь, это поможет вам встать на правильный путь.:)
Простой способ, который работает:
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
}
}
Если вы используете 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, но его можно перевести на С#. Выкладываю это решение здесь, может кому пригодится.
Я использовал аналогичный способ решения этой проблемы с помощью предложения анимескм, действительно, мы можем получить значения определенных ячеек из группы выбранных ячеек, используя вспомогательный список:
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);
}
}