You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决DataTable.RowChanged事件中设置DataContext触发的CS0120错误

错误原因

CS0120报错的核心是访问权限问题:DataTableRowChanged方法被声明为静态方法(带static修饰符),而DataContext是MainWindow窗口类的实例属性,静态方法运行时不关联任何类实例,因此无法直接访问实例属性。

修复步骤

仅需要移除DataTableRowChanged方法的static修饰符即可解决编译报错,修改后的方法声明如下:

private void DataTableRowChanged()

如果后续需要在Row_Changed事件回调中操作当前窗口的界面元素,也可以同步移除该方法的static修饰符,无相关需求的话可以保留,不影响运行。

修复后完整代码(MainWindow.xaml.cs)

using System;
using System.Data;
using System.Windows;

namespace DataTable_RowChanged
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            DataTableRowChanged();
        }

        // 移除了static修饰符
        private void DataTableRowChanged()
        {
            DataTable custTable = new DataTable("Customers");
            // add columns
            custTable.Columns.Add("id", typeof(int));
            custTable.Columns.Add("name", typeof(string));
            custTable.Columns.Add("address", typeof(string));

            // set PrimaryKey
            custTable.Columns["id"].Unique = true;
            custTable.PrimaryKey = new DataColumn[] { custTable.Columns["id"] };

            // add a RowChanged event handler for the table.
            custTable.RowChanged += new DataRowChangeEventHandler(Row_Changed);

            for (int id = 0; id < 10; id++)
            {
                custTable.Rows.Add(
                    new object[] { id, string.Format("customer{0}", id),
            string.Format("address{0}", id) });
            }

            custTable.AcceptChanges();

            // change the name column in all the rows
            foreach (DataRow row in custTable.Rows)
            {
                row["name"] = string.Format("vip{0}", row["id"]);
            }

            // 此处可正常访问实例属性DataContext
            DataContext = custTable; 
        }

        // 无界面操作需求可保留static,有需求则移除
        private static void Row_Changed(object sender, DataRowChangeEventArgs e)
        {
            Console.WriteLine("Row_Changed Event: name={0}; action={1}",
                e.Row["name"], e.Action);
        }
    }
}

修改完成后重新编译运行,DataTable数据会正常绑定到界面的DataGrid控件,RowChanged事件也会按预期触发输出日志。

内容的提问来源于stack exchange,提问作者IanHacker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 04:09:01