2011-02-25 3 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

+0

Согласно моим выводам, решение easisest: http://stackoverflow.com/a/42013760/7103438 –

ответ

51

ОБНОВЛЕНО

Чтобы получить выбранные строки попробовать:

IList rows = dg.SelectedItems; 

Затем вы должны быть в состоянии добраться до значения столбца из элемента строки.

ИЛИ

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

Тогда:

row["ColumnName"]; 
+0

Я бы сказал, что это WPF, и, похоже, не выбрано SelectedRows/SelectedRow – Prisoner

+0

Второй вариант дает мне: Unable для создания объекта типа «iAdvert_Desktop.User» для ввода «System.Data.DataRowView», и я не могу получить первый вариант работы: /. Я довольно новичок в C#. – Prisoner

+0

Вы можете изменить DataRowView для пользователя. Посмотрите, делает ли это это. Я не знал, что это за тип ваших предметов. –

2

Я считаю, что причина нет прямой собственности для доступа к выбранным ряда из WPF DataGrid, потому что режим выбора сетки данных может быть либо на уровне строки, либо на уровне ячейки. Таким образом, свойства и события, связанные с выбором, все написаны в отношении выбора на уровне ячейки - вы всегда будете выбирать соты независимо от режима выбора сетки, но вы не гарантированно имеете выбранную строку .

Я не знаю точно, чего вы пытаетесь достичь, обработав событие CellEditEnding, но чтобы получить значения всех выбранных ячеек при выборе строки, взгляните на обработку SelectedCellsChanged event. Особенно обратите внимание на замечания в этой статье:

можно обрабатывать SelectedCellsChanged события, чтобы быть уведомлен, когда коллекция выбранных ячеек изменяется. Если выбор включает полные строки, событие Selector.SelectionChanged равно .

Вы можете извлечь AddedCells и RemovedCells из SelectedCellsChangedEventArgs в обработчике событий.

Надежды, которые помогут вам на правильном пути. :)

+0

Ну, идея этого фрагмента кода позволит мне: Нажмите, чтобы изменить имя пользователя, а затем, когда закончите редактирование, я хочу сохранить значение на основе UserID пользователя, который является ReadOnly. Поэтому мне нужно получить все ячейки для строки (ну, только UserID и UserName в этом экземпляре). – Prisoner

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 в моем ViewModel.

6

Решение основано на Tonys ответа:

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

старый вопрос, но я изменил SelectedItems [0] на SelectedItem ... но это помогло мне много! :) upvote! – Arrie

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

Я думаю, это нормально, если у вас есть CheckBox в каждой из ваших ячеек. Конечно, в бесконечном числе ситуаций, где нет ... – ouflak

1

После нескольких часов поиска путей о том, как получить данные из строки, выбранной на WPF DataGrid Control , поскольку я использовал 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; } 
} 
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 предложения приемлема, мы действительно можем получить конкретные значения ячеек из группы выбранных ячеек с помощью списка ДОПОЛНИТЕЛЬНОГО:

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); 
     } 
    } 
Смежные вопросы