web-dev-qa-db-ja.com

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を使用するためのチュートリアルとヘルプがたくさんありますが、私はこれを使用していません。

33
Prisoner

[〜#〜] updated [〜#〜]

選択した行を取得するには:

IList rows = dg.SelectedItems;

これで、行アイテムから列の値を取得できるはずです。

[〜#〜]または[〜#〜]

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

次に:

row["ColumnName"];
61
Tony Abrams

トニーズの回答に基づくソリューション:

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

私は似たようなことをしましたが、バインドを使用して選択したアイテムを取得します:

<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にアクセスできます。

6
Philippe Lavoie

WPF DataGridの選択されたrowにアクセスするための簡単なプロパティがない理由は、DataGridの選択モードが行レベルまたはまたはセルレベル。したがって、選択関連のプロパティとイベントはすべてセルレベルの選択に対して書き込まれます-グリッドの選択モードに関係なく、常にcellsが選択されますが、保証はありません選択されたを持つ。

CellEditEndingイベントを処理して何を達成しようとしているのか正確にはわかりませんが、行を選択したときに選択したすべてのセルの値を取得するには、 SelectedCellsChangedイベント の処理を見てください。代わりに。特にその記事の所見に注意してください。

SelectedCellsChangedイベントを処理して、選択したセルのコレクションが変更されたときに通知を受けることができます。選択に行全体が含まれる場合、Selector.SelectionChangedイベントも発生します。

イベントハンドラーのSelectedCellsChangedEventArgsからAddedCellsおよびRemovedCellsを取得できます。

それがあなたを正しい軌道に乗せることを願っています。 :)

2
Dan J

DataGridは選択された行の列値を取得し、以下のコードでアクセスできます。ここで、grid1はGrideの名前です。

private void Edit_Click(object sender, RoutedEventArgs e)
{
    DataRowView rowview = grid1.SelectedItem as DataRowView;
    string id = rowview.Row[0].ToString();
}
2
Ambikesh Mishra

MongoDBを使用していたように、WPF DataGridコントロールで選択された行からデータを取得する方法を何時間も見つけました。この投稿を見つけて、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
f123

動作する簡単な方法:

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
    }
}
1
aminescm

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);
        }
    }
0
Oswaldo Zarate