DataGrid получает значения столбцов выбранных строк - PullRequest
33 голосов
/ 25 февраля 2011

Я пытаюсь получить значения каждого столбца выбранной строки в 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, но я этим не пользуюсь.

Ответы [ 8 ]

61 голосов
/ 25 февраля 2011

ОБНОВЛЕНО

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

IList rows = dg.SelectedItems;

После этого вы сможете получить значение столбца из строки.

OR

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

Тогда:

row["ColumnName"];
7 голосов
/ 25 февраля 2011

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

        DataGrid dg = sender as DataGrid;
        User row = (User)dg.SelectedItems[0];
        Console.WriteLine(row.UserID);
6 голосов
/ 25 февраля 2011

Я сделал нечто подобное, но я использую привязку, чтобы получить выбранный элемент:

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

2 голосов
/ 25 февраля 2011

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

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

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

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

Надеюсь, что поможет положитьВы на правильном пути.:)

1 голос
/ 23 марта 2015

DataGrid получает значения столбцов выбранных строк, к которым можно получить доступ по следующему коду. Здесь grid1 - это имя Gride.

private void Edit_Click(object sender, RoutedEventArgs e)
{
    DataRowView rowview = grid1.SelectedItem as DataRowView;
    string id = rowview.Row[0].ToString();
}
1 голос
/ 26 февраля 2015

После нескольких часов поиска путей получения данных из строки, выбранной в элементе управления 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; }   
}
1 голос
/ 07 июня 2012

Простой способ, который работает:

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 голосов
/ 22 сентября 2015

Я использовал аналогичный способ решения этой проблемы с помощью предложения анимескм, действительно, мы можем получить конкретные значения ячеек из группы выбранных ячеек, используя вспомогательный список:

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);
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...