質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
DataGrid

GUIの一種であり、データを表の形式でみることが可能です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

1回答

2108閲覧

データグリッドでラジオボタンが選択した行を取得したい

Wind

総合スコア442

DataGrid

GUIの一種であり、データを表の形式でみることが可能です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

1グッド

0クリップ

投稿2023/03/03 08:39

実現したいこと

  • データグリッドにラジオボタンを実装する
  • ラジオボタンで選択した行の情報を取得する

発生している問題・エラーメッセージ

WPFのデータグリッドにラジオボタンを実装したいのですが、選択した行の取得方法がわかりません。
このサンプルではTestボタンを押した時にラジオボタンが選択している行の名前を取得しようとしましたが、出来ませんでした。

該当のソースコード

XAML

1Window x:Class="WpfRadio.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 6 xmlns:local="clr-namespace:WpfRadio" 7 mc:Ignorable="d" 8 Title="MainWindow" Height="450" Width="800"> 9 <Grid> 10 <StackPanel Orientation="Vertical"> 11 <StackPanel Orientation="Horizontal"> 12 <Button Width="100" x:Name="Test" Content="Test" Margin="10" Click="Test_Click"/> 13 <Label x:Name="LabelTest" Content="test"/> 14 </StackPanel> 15 <DataGrid ScrollViewer.HorizontalScrollBarVisibility="Auto" ScrollViewer.VerticalScrollBarVisibility="Visible" Margin="5" 16 Name="DG" IsReadOnly="false" AutoGenerateColumns="False" FontSize="16" 17 CanUserSortColumns="False" 18 CanUserAddRows="False" 19 CanUserDeleteRows="False" 20 CanUserResizeRows="False" 21 SelectionUnit="Cell" 22 > 23 <DataGrid.Columns> 24 <DataGridTextColumn x:Name="No" Header="No." Binding="{Binding No}"/> 25 <DataGridTextColumn x:Name="Name" Header="名前" Binding="{Binding Name}"/> 26 <!-- DataGridCheckBoxColumn x:Name="Select" Header="選択" Binding="{Binding Select}" /--> 27 <DataGridTemplateColumn Header="選択" x:Name="Temp"> 28 <DataGridTemplateColumn.CellTemplate> 29 <DataTemplate> 30 <RadioButton x:Name="Select" GroupName="sel"/> 31 </DataTemplate> 32 </DataGridTemplateColumn.CellTemplate> 33 </DataGridTemplateColumn> 34 </DataGrid.Columns> 35 </DataGrid> 36 </StackPanel> 37 </Grid> 38</Window> 39

C#

1using System; 2using System.Collections.ObjectModel; 3using System.Threading.Tasks; 4using System.Windows; 5 6namespace WpfRadio 7{ 8 /// <summary> 9 /// MainWindow.xaml の相互作用ロジック 10 /// </summary> 11 public partial class MainWindow : Window 12 { 13 public MainWindow() 14 { 15 InitializeComponent(); 16 DG_5(); 17 } 18 19 // データグリッドを5行表示する 20 private async void DG_5() 21 { 22 for(int i = 0; i < 5; i++) 23 { 24 PDG.Add(new ClsDG(i,"名前" + (i+1).ToString() , false)); 25 } 26 await Task.Run(() => TaskViewGrid()); 27 } 28 29 private void TaskViewGrid() 30 { 31 Dispatcher.Invoke((Action)(() => 32 { 33 DG.ItemsSource = PDG; 34 })); 35 } 36 37 ObservableCollection<ClsDG> PDG = new ObservableCollection<ClsDG>(); 38 39 private class ClsDG 40 { 41 public string No { get; set; } = ""; 42 public string Name { get; set; } = ""; 43 public string Select { get; set; } = ""; 44 45 public ClsDG(int no,string name, bool select) 46 { 47 No = no.ToString(); 48 Name = name; 49 Select = select.ToString(); 50 } 51 } 52 53 private void Test_Click(object sender, RoutedEventArgs e) 54 { 55 // 選択したラジオボタンの名前を表示したい 56 LabelTest.Content = PDG[3].Name; // 仮で4行目の名前を表示 57 } 58 } 59} 60

補足情報(FW/ツールのバージョンなど)

.NET Framework 4.7.2

TN8001👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

単純にやるならRadioButtonCheckedで、覚えておけばいいんじゃないですかね?

バインドで済ませられそうな気もしますが、ClsDGboolを生やすのは(選択は1個と分かっているので)無駄が多いし、かといって共通の何かにバインドするのは仮想化されてると動かなそうな気もする(未確認)

xml

1<Window 2 x:Class="Q64waxex3au636m.MainWindow" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5 Width="800" 6 Height="450"> 7 <DockPanel> 8 <StackPanel DockPanel.Dock="Top" Orientation="Horizontal"> 9 <Button 10 MinWidth="100" 11 Margin="10" 12 Click="Test_Click" 13 Content="Test" /> 14 <Label 15 x:Name="LabelTest" 16 VerticalAlignment="Center" 17 Content="test" /> 18 </StackPanel> 19 <DataGrid 20 Margin="5" 21 AutoGenerateColumns="False" 22 CanUserAddRows="False" 23 CanUserDeleteRows="False" 24 CanUserResizeRows="False" 25 CanUserSortColumns="False" 26 FontSize="16" 27 ItemsSource="{Binding PDG}" 28 ScrollViewer.VerticalScrollBarVisibility="Visible" 29 SelectionUnit="Cell"> 30 <DataGrid.Columns> 31 <DataGridTextColumn Binding="{Binding No}" Header="No." /> 32 <DataGridTextColumn Binding="{Binding Name}" Header="名前" /> 33 <DataGridTemplateColumn Header="選択"> 34 <DataGridTemplateColumn.CellTemplate> 35 <DataTemplate> 36 <RadioButton 37 VerticalContentAlignment="Center" 38 Checked="Select_Checked" 39 GroupName="sel" /> 40 </DataTemplate> 41 </DataGridTemplateColumn.CellTemplate> 42 </DataGridTemplateColumn> 43 </DataGrid.Columns> 44 </DataGrid> 45 </DockPanel> 46</Window>

cs

1using System.Collections.ObjectModel; 2using System.Windows; 3using System.Windows.Controls; 4 5namespace Q64waxex3au636m 6{ 7 public class ClsDG 8 { 9 public string No { get; set; } = ""; 10 public string Name { get; set; } = ""; 11 public string Select { get; set; } = ""; 12 13 public ClsDG(int no, string name, bool select) 14 { 15 No = no.ToString(); 16 Name = name; 17 Select = select.ToString(); 18 } 19 } 20 21 public partial class MainWindow : Window 22 { 23 public ObservableCollection<ClsDG> PDG { get; } = new ObservableCollection<ClsDG>(); 24 25 private ClsDG SelectedClsDG; 26 27 28 public MainWindow() 29 { 30 InitializeComponent(); 31 DataContext = this; 32 33 // DG_5が別スレッドから呼ばれるのであれば... 34 //BindingOperations.EnableCollectionSynchronization(PDG, new object()); 35 DG_5(); 36 } 37 38 private void DG_5() 39 { 40 for (int i = 0; i < 5; i++) 41 PDG.Add(new ClsDG(i, $"名前{i + 1}", false)); 42 } 43 44 private void Test_Click(object sender, RoutedEventArgs e) 45 { 46 LabelTest.Content = SelectedClsDG?.Name; 47 } 48 49 private void Select_Checked(object sender, RoutedEventArgs e) 50 { 51 SelectedClsDG = (ClsDG)((RadioButton)sender).DataContext; 52 } 53 } 54}

投稿2023/03/03 10:46

TN8001

総合スコア9321

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Wind

2023/03/03 14:17

Checkedで良かったのですね! ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問