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

如何将变量与DataTable中的DataRow绑定以实现自动更新?

如何让变量与DataRow自动同步?

直接把普通的string或int变量和DataRow绑定是不可行的——因为这些类型要么是值类型,要么是不可变的引用类型,完全没有属性变更通知的机制。当你修改变量值的时候,DataTable根本无从知晓发生了变化,自然没法自动同步。

不过我们可以通过一个简单的封装来实现这个需求:用一个实现了INotifyPropertyChanged接口的模型类来包装你的car和number,然后通过订阅变更事件来自动更新DataRow。

步骤1:创建带变更通知的模型类

首先定义一个包含Car和Number属性的类,实现INotifyPropertyChanged接口——这是.NET里实现属性变更通知的标准方式:

using System.ComponentModel;

public class CarRecord : INotifyPropertyChanged
{
    private string _car;
    private int _number;

    public string Car
    {
        get => _car;
        set
        {
            if (_car != value)
            {
                _car = value;
                OnPropertyChanged(nameof(Car));
            }
        }
    }

    public int Number
    {
        get => _number;
        set
        {
            if (_number != value)
            {
                _number = value;
                OnPropertyChanged(nameof(Number));
            }
        }
    }

    // 变更通知事件
    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

步骤2:关联模型与DataRow

接下来我们创建模型实例、DataTable和DataRow,然后订阅模型的PropertyChanged事件,当属性值变化时自动更新DataRow:

// 初始化模型和DataTable
var carRecord = new CarRecord { Car = "cabrio", Number = 20 };

DataTable dt = new DataTable();
dt.Columns.Add("Name", typeof(string));
dt.Columns.Add("Number", typeof(int));
var targetRow = dt.Rows.Add(carRecord.Car, carRecord.Number);

// 订阅属性变更事件,自动同步到DataRow
carRecord.PropertyChanged += (sender, args) =>
{
    switch (args.PropertyName)
    {
        case nameof(CarRecord.Car):
            targetRow["Name"] = carRecord.Car;
            break;
        case nameof(CarRecord.Number):
            targetRow["Number"] = carRecord.Number;
            break;
    }
};

// 测试修改属性,DataRow会自动更新
carRecord.Car = "sedan";
carRecord.Number = 30;

// 验证结果
Console.WriteLine(targetRow["Name"]); // 输出: sedan
Console.WriteLine(targetRow["Number"]); // 输出: 30

可选:双向同步

如果需要反过来,当DataRow的值被修改时也同步回模型属性,可以订阅DataTable的ColumnChanged事件:

dt.ColumnChanged += (sender, args) =>
{
    if (args.Row == targetRow)
    {
        switch (args.Column.ColumnName)
        {
            case "Name":
                carRecord.Car = args.Row["Name"].ToString();
                break;
            case "Number":
                carRecord.Number = (int)args.Row["Number"];
                break;
        }
    }
};

// 测试修改DataRow,模型属性也会更新
targetRow["Name"] = "suv";
Console.WriteLine(carRecord.Car); // 输出: suv

为什么这能工作?

INotifyPropertyChanged接口让模型类在属性值变化时触发PropertyChanged事件,我们通过订阅这个事件,就能在第一时间把新值同步到DataRow里。这是.NET中实现数据绑定和自动同步的标准模式,不管是后台代码还是UI场景(比如WinForms/WPF)都适用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:39:43