前提・実現したいこと
WPFでシステムを作成しています。
DataGridでデータ入力をする際最後の行の特定のセルのみReadOnly=falseにしたいです。
調べてみた結果わからなかったため質問させていただきます。
列1 | 列2 | 列3 |
---|---|---|
Readonly = true | ||
Readonly = true | ||
ここだけReadonly = false |
上記のように最後の行の特定のセルのみを編集できるようにするDataGridは作成することはできるのでしょうか?
補足情報(FW/ツールのバージョンなど)
.NET Framework 4.8
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
簡単にやるならIsReadOnly="False"
のまま、通常行をBeginningEdit
でキャンセルすることですかね。
xamlだけでやれないこともなさそうなんですが、面倒そうなので考えるのを諦めました^^;
xml
1<Window 2 x:Class="Questions316745.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 <Grid> 8 <DataGrid 9 AutoGenerateColumns="False" 10 BeginningEdit="DataGrid_BeginningEdit" 11 ItemsSource="{Binding Items}"> 12 <DataGrid.Columns> 13 <!--<DataGridTextColumn Binding="{Binding Id}" Header="ID" IsReadOnly="True" />--> 14 <DataGridTextColumn Binding="{Binding Id}" Header="ID" /> 15 <DataGridTextColumn Binding="{Binding Name}" Header="名前" /> 16 <DataGridTextColumn Binding="{Binding Description}" Header="説明" /> 17 </DataGrid.Columns> 18 </DataGrid> 19 </Grid> 20</Window>
cs
1using Prism.Mvvm; 2using System.Collections.ObjectModel; 3using System.Windows; 4using System.Windows.Controls; 5 6namespace Questions316745 7{ 8 public class Item : BindableBase 9 { 10 private int _Id; 11 public int Id { get => _Id; set => SetProperty(ref _Id, value); } 12 13 private string _Name; 14 public string Name { get => _Name; set => SetProperty(ref _Name, value); } 15 16 private string _Description; 17 public string Description { get => _Description; set => SetProperty(ref _Description, value); } 18 } 19 20 public partial class MainWindow : Window 21 { 22 public ObservableCollection<Item> Items { get; } 23 24 public MainWindow() 25 { 26 InitializeComponent(); 27 28 Items = new ObservableCollection<Item> 29 { 30 new Item{ Id = 1, Name = "hoge", Description = "aaa", }, 31 new Item{ Id = 2, Name = "fuga", Description = "bbb", }, 32 new Item{ Id = 3, Name = "piyo", Description = "ccc", }, 33 }; 34 35 DataContext = this; 36 } 37 38 private void DataGrid_BeginningEdit(object sender, DataGridBeginningEditEventArgs e) 39 { 40 // もうちょっとましな判定法あると思うw 41 if (e.Column.Header.ToString() == "ID" && !e.Row.IsNewItem) 42 e.Cancel = true; 43 } 44 } 45}
INotifyPropertyChanged
にPrism.Coreを使用しました。
しかしこういった要件というのは、ユニークなID等の列ではないのですか?
バリデーションをかけるなら既存行も編集可にしてもよいですし、自動採番なら新規行も編集させたくないですよね?
投稿2021/01/18 09:07
編集2023/07/26 13:12総合スコア9855
0
DataGridでは個別の設定はないかもしれません。
DataGridコントロール(System.Windows.Forms)編メニュー
DataGridViewであれば個別のプロパティで指定できます。
DataGridView.Rows[x].ReadonlyやDataGridView[x,y].Readonlyで指定できます。
DataGridViewの指定したセルを編集できないようにする
指定した列、行、セルのみを編集できないようにするには、それぞれDataGridViewColumn、DataGridViewRow、DataGridViewCellオブジェクトのReadOnlyプロパティをTrueにします。
末尾はDataGridView.Rows.Countで確認できます。
投稿2021/01/18 05:37
編集2021/01/18 05:45退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2021/01/18 05:59
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。