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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

.NET Core

.NET Coreは、マネージソフトウェアフレームワークでオープンソースで実装されています。クロスプラットフォームを前提に考えられており、Windows/Mac/Linuxで動くアプリケーションを作成することが可能です。

C#

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

WPF

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

Q&A

解決済

1回答

2288閲覧

DataTableの内容をGUI上で変更禁止にする方法

Q10

総合スコア12

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

.NET Core

.NET Coreは、マネージソフトウェアフレームワークでオープンソースで実装されています。クロスプラットフォームを前提に考えられており、Windows/Mac/Linuxで動くアプリケーションを作成することが可能です。

C#

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

WPF

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

1グッド

0クリップ

投稿2021/09/02 11:22

前提・実現したいこと

DataTableの内容をGUI上で変更禁止にする方法を知りたいです。

検索すると、RowChangedイベントが発生したときにRejectChangesで変更を阻止すればよいとのことでした:

How to make a DataTable ReadOnly?
RowChanged
RejectChanges

それで、RowChangedのコードを参考にRejectChangesで変更を阻止しようとしたのですが、下手に変更を阻止し過ぎているせいか(?)Rowが空っぽになってしまい、次のエラーが出てしまいます。

System.Data.RowNotInTableException: 'This row has been removed from a table and does not have any data. BeginEdit() will allow creation of new data in this row.'

この方法ではなくてもよいので、DataTableの内容をGUI上で変更禁止にする方法を教えて下さい。

該当のソースコード

C#

1using System; 2using System.Data; 3using System.Windows; 4 5namespace DataTable_RowChanged 6{ 7 public partial class MainWindow : Window 8 { 9 public MainWindow() 10 { 11 InitializeComponent(); 12 DataTableRowChanged(); 13 } 14 15 private void DataTableRowChanged() 16 { 17 DataTable custTable = new DataTable("Customers"); 18 19 custTable.Columns.Add("id", typeof(int)); 20 custTable.Columns.Add("name", typeof(string)); 21 custTable.Columns.Add("address", typeof(string)); 22 23 custTable.Columns["id"].Unique = true; 24 custTable.PrimaryKey = new DataColumn[] { custTable.Columns["id"] }; 25 26 custTable.RowChanged += new DataRowChangeEventHandler(Row_Changed); 27 28 for (int id = 1; id <= 10; id++) 29 { 30 custTable.Rows.Add( 31 new object[] { id, string.Format("customer{0}", id), 32 string.Format("address{0}", id) }); 33 } 34 35 custTable.AcceptChanges(); 36 37 foreach (DataRow row in custTable.Rows) 38 { 39 row["name"] = string.Format("vip{0}", row["id"]); 40 } 41 DataContext = custTable; 42 } 43 44 private static void Row_Changed(object sender, DataRowChangeEventArgs e) 45 { 46 e.Row.RejectChanges(); // ここでエラー;この行を消せばエラー無く動作する(が変更も可能になる) 47 Console.WriteLine("Row_Changed Event: name={0}; action={1}", e.Row["name"], e.Action); 48 } 49 } 50}

C#

1<Window x:Class="DataTable_RowChanged.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:DataTable_RowChanged" 7 mc:Ignorable="d" 8 Title="MainWindow" Height="450" Width="800"> 9 <Grid> 10 <DataGrid ItemsSource="{Binding}"/> 11 </Grid> 12</Window>

試したこと

RejectChangesのコードを見ると、

C#

1itemColumns[3].RejectChanges();

のように、RowではなくColumnでRejectChanges()しているようです。
なので、e.とかsender.でいろいろ掘ってみましたが、
custTable.Columnsに該当するものは見つかりませんでした。
(もし仮に見つかっても、これが正解かどうかも分かりません。)
どのようにしたら良いのでしょうか?

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

Windows 10
WPF Application .NET Core 3.1
Visual Studio Community 2019

TN8001👍を押しています

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

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

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

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

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

TN8001

2021/09/02 13:25

<DataGrid IsReadOnly="True" ItemsSource="{Binding}"/> とするのではダメなのですか?
Q10

2021/09/02 15:12

素晴らしい!どうかそれを回答として書いて下さい。 今、IsReadOnly="True"と追加して、GUI上で変更ができないことが確認できました。
guest

回答1

0

ベストアンサー

xml

1<DataGrid IsReadOnly="True" ItemsSource="{Binding}"/>

DataGrid.IsReadOnly プロパティ (System.Windows.Controls) | Microsoft Docs

投稿2021/09/02 15:30

編集2023/07/29 04:14
TN8001

総合スコア9862

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

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

Q10

2021/09/02 15:45

DataGridにIsReadOnly="True"を追加すればよかったんですね。 本当に助かりました。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問