色々なサイトを参考にさせて頂いてます。
最終的には、WPFでCSVファイルを読込み、DataTableに表示させたいと思っています。
初歩的な事かもしれず大変申し訳ないのですが、教えてください。
【知りたい事】
・クリックされたセルの修正(プログラム側で)
⇒ObservableCollectionの修正方法
ObservableCollection<myData>
これを myData[row][col]="A"みたいに編集したりしたいです。
<DataGrid Name="dataGrid" ItemsSource="{Binding Path=myData}" CanUserSortColumns="False" IsReadOnly="True" AutoGenerateColumns="False" CanUserReorderColumns="False" MouseDoubleClick="dataGrid_MouseDBLCLK"> <DataGrid.Columns> <DataGridTextColumn Binding="{Binding Path=Title,TargetNullValue=''}" Header="タイトル" MinWidth="100"/> <DataGridTextColumn Binding="{Binding Path=CurrentFol,TargetNullValue=''}" Header="カレントフォルダ" /> <DataGridTextColumn Binding="{Binding Path=Pic,TargetNullValue=''}" Header="画像" /> </DataGrid.Columns> </DataGrid> <Button Content="Button" HorizontalAlignment="Left" Height="72" Margin="311,620,0,0" VerticalAlignment="Top" Width="157" Click="Button_Click"/>
public MainWindow() { InitializeComponent(); UpdateDispList(); } //表示用リストを再設定 private void UpdateDispList() { //dataGrid.ItemsSource = myData; dataGrid.ItemsSource = new ObservableCollection<myData> { new myData { Title="化粧品", CurrentFol="/pic" }, new myData { Title="洗剤", CurrentFol="/pic" }, new myData { Title="パン", CurrentFol="/pic" }, }; } //座標を出すもの private void dataGrid_MouseDBLCLK(object sender, MouseButtonEventArgs e) { // データグリッドでマウスがクリックされた位置を取得します。 var dataGrid = sender as DataGrid; var point = e.GetPosition(dataGrid); // データグリッドでマウスがクリックされた位置の行オブジェクトを取得します。 var row = GetDataGridObject<DataGridRow>(dataGrid, point); if (row == null) { return; } // 行オブジェクトから行インデックス(0起算)を取得します。 var rowIndex = row.GetIndex(); // データグリッドでマウスがクリックされた位置のセルオブジェクトを取得します。 var cell = GetDataGridObject<DataGridCell>(dataGrid, point); if (cell == null) { return; } // セルオブジェクトから列インデックス(0起算)を取得します。 var columnIndex = cell.Column.DisplayIndex; MessageBox.Show($"行={rowIndex} 列={columnIndex}"); switch (columnIndex) { case 0: break; case 1: //ファイル選択画面 string exeFolder = AppDomain.CurrentDomain.BaseDirectory; var uriBase = new Uri(exeFolder);//カレントディレクトリ var Cell = GetCellText(dataGrid,columnIndex, rowIndex);//dataGridのCell値取得 var dlg = new MSAPI::Dialogs.CommonOpenFileDialog(); // フォルダ選択ダイアログ(falseにするとファイル選択ダイアログ) dlg.IsFolderPicker = true; // タイトル dlg.Title = "フォルダを選択してください"; // 初期ディレクトリ dlg.InitialDirectory = exeFolder + Cell; if (dlg.ShowDialog() == MSAPI::Dialogs.CommonFileDialogResult.Ok) { // MessageBox.Show($"{dlg.FileName}が選択されました。"); var uriTarget = new Uri(dlg.FileName); // MakeRelativeUriメソッドで相対パスを取得する // 同時にURIに変換する際にエスケープされた文字列をアンエスケープする var relativePath = Uri.UnescapeDataString(uriBase.MakeRelativeUri(uriTarget).ToString()); // var img = new BitmapImage(new Uri("フォルダー/Test.png", UriKind.Relative)); } break; case 2: break; default: return; } } //座標を出すもの private T GetDataGridObject<T>(DataGrid dataGrid, Point point) { T result = default(T); var hitResultTest = VisualTreeHelper.HitTest(dataGrid, point); if (hitResultTest != null) { var visualHit = hitResultTest.VisualHit; while (visualHit != null) { if (visualHit is T) { result = (T)(object)visualHit; break; } visualHit = VisualTreeHelper.GetParent(visualHit); } } return result; } private void Button_Click(object sender, RoutedEventArgs e) { //値の変更が可能かテスト dataGrid.ItemsSource = new ObservableCollection<myData> { new myData { Title="あ", CurrentFol="/pic" }, new myData { Title="い", CurrentFol="/pic" }, new myData { Title="う", CurrentFol="/pic" }, new myData { Title="あ", CurrentFol="/pic" }, new myData { Title="い", CurrentFol="/pic" }, new myData { Title="う", CurrentFol="/pic" }, };
class myData { public string Title{ get; set; } public String CurrentFol { get; set; } public String Pic { get; set; } }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2021/05/31 23:53
2021/06/01 03:39
退会済みユーザー
2021/06/01 04:14
2021/06/01 04:46
退会済みユーザー
2021/06/01 08:23