WPF如何编辑DataGrid行?临时存储数据时修改选中行遇阻
解决DataGrid编辑选中行的问题
嘿,我知道你现在卡在DataGrid编辑选中行的问题上了——其实核心问题出在你用的匿名类型上!匿名类型的属性默认是只读的,根本没法直接修改。咱们一步步来搞定这个功能:
1. 先创建一个可编辑的实体类
代替原来的匿名类型,咱们定义一个包含所有需要字段的实体类,每个属性都要有get和set方法,这样才能支持修改:
public class InsRecord { public string Num_Ins { get; set; } public string Dat_Ins { get; set; } // 这里加上你需要的其他所有字段,比如: // public string OtherField1 { get; set; } // public int OtherField2 { get; set; } }
2. 改用ObservableCollection存储数据(更推荐)
原来直接往gridlist.Items里加数据的方式不够灵活,换成ObservableCollection<InsRecord>,它能自动通知UI数据变化,不管是添加、删除还是修改,UI都会实时更新:
首先在你的页面/窗口类里定义这个集合:
private ObservableCollection<InsRecord> _recordList = new ObservableCollection<InsRecord>();
然后在初始化的时候把它绑定到DataGrid的ItemsSource:
gridlist.ItemsSource = _recordList;
3. 修改你的添加功能代码
现在添加新记录时,创建InsRecord对象而不是匿名类型:
_recordList.Add(new InsRecord { Num_Ins = num_ins.Text, Dat_Ins = DateTime.Now.ToShortDateString() // 其他字段也对应赋值 });
4. 修改删除功能代码(适配ObservableCollection)
删除逻辑可以简化一点,直接移除选中的实体:
var selectedRecord = gridlist.SelectedItem as InsRecord; if (selectedRecord != null) { _recordList.Remove(selectedRecord); }
5. 实现编辑选中行的功能
现在因为实体类的属性是可读写的,直接修改选中对象的属性就行。比如你可以加一个“编辑”按钮,点击后把选中行的数据填充到输入框,用户修改后再保存:
步骤A:点击编辑按钮,把选中行数据加载到输入框
var selectedRecord = gridlist.SelectedItem as InsRecord; if (selectedRecord != null) { // 把选中行的数据填充到你的输入控件里 num_ins.Text = selectedRecord.Num_Ins; // 其他字段也对应赋值到输入框,比如: // otherField.Text = selectedRecord.OtherField1; }
步骤B:点击保存按钮,更新选中行的数据
var selectedRecord = gridlist.SelectedItem as InsRecord; if (selectedRecord != null) { // 更新选中对象的属性值 selectedRecord.Num_Ins = num_ins.Text; selectedRecord.Dat_Ins = DateTime.Now.ToShortDateString(); // 或者保留原日期,看你需求 // 其他字段也对应更新 // 因为用了ObservableCollection,UI会自动刷新显示修改后的数据 }
额外选项:允许直接在DataGrid里编辑
如果你想让用户直接在DataGrid的单元格里编辑,只需要确保DataGrid的列是可编辑的。比如在XAML里设置列的IsReadOnly为False(默认就是False,除非你手动设成True了):
<DataGrid x:Name="gridlist" AutoGenerateColumns="False"> <DataGrid.Columns> <DataGridTextColumn Header="编号" Binding="{Binding Num_Ins}" IsReadOnly="False"/> <DataGridTextColumn Header="日期" Binding="{Binding Dat_Ins}" IsReadOnly="True"/> <!-- 如果日期不想让用户改,设为True --> <!-- 其他列同理 --> </DataGrid.Columns> </DataGrid>
这样用户双击单元格就能直接编辑,修改后数据会自动同步到你的InsRecord对象里,非常方便!
内容的提问来源于stack exchange,提问作者D.P.
相关产品推荐
相关产品推荐

