前提・実現したいこと
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
回答1件
あなたの回答
tips
プレビュー