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

使用Linq修改DataTable单元格值:房型/套餐费率场景实现咨询

嘿,我来帮你搞定这个用LINQ更新DataTable的需求,分步骤来很清晰:

1. 先规整房型费率参考数据

用强类型对象来存参考数据会让LINQ操作更顺手,当然你也可以直接用DataTable,这里先给你最直观的实现方式:

// 定义房型费率参考类
public class RoomRateReference
{
    public int RoomNo { get; set; }
    public int MaxCapacity { get; set; }
    public decimal Amount { get; set; }
}

// 初始化你提供的参考数据
var roomRateReferences = new List<RoomRateReference>
{
    new RoomRateReference { RoomNo = 101, MaxCapacity = 4, Amount = 1200 },
    new RoomRateReference { RoomNo = 102, MaxCapacity = 4, Amount = 1200 },
    new RoomRateReference { RoomNo = 201, MaxCapacity = 4, Amount = 1500 },
    new RoomRateReference { RoomNo = 202, MaxCapacity = 5, Amount = 1700 }
};
2. ComboBox选择事件中的LINQ更新逻辑

当用户选中「房型费率」时,我们用LINQ关联目标DataTable和参考数据,批量更新Amount字段:

// 假设你的目标DataTable叫targetDt,ComboBox控件叫cbRateType
private void cbRateType_SelectedIndexChanged(object sender, EventArgs e)
{
    if (cbRateType.SelectedItem.ToString() == "Room Rate(房型费率)")
    {
        // 用LINQ关联两个数据源,匹配房间号并获取对应的费率
        var updatePairs = from targetRow in targetDt.AsEnumerable()
                          join refRate in roomRateReferences
                          on targetRow.Field<int>("RoomNo") equals refRate.RoomNo
                          select new 
                          { 
                              TargetRow = targetRow, 
                              NewAmount = refRate.Amount 
                          };

        // 遍历结果更新目标DataTable的Amount值
        foreach (var pair in updatePairs)
        {
            pair.TargetRow.SetField("Amount", pair.NewAmount);
        }

        // 提交更改并刷新界面(比如绑定的DataGridView)
        targetDt.AcceptChanges();
        dataGridView1.Refresh();
    }
    else if (cbRateType.SelectedItem.ToString() == "Package Rate(套餐费率)")
    {
        // 这里处理套餐费率的逻辑,比如显示参数输入文本框,你可以后续补充细节
        txtPackageParams.Visible = true;
        // ...其他套餐相关逻辑
    }
}
3. 补充适配场景

如果你的房型费率参考数据本来就存在另一个DataTable里,只需要把上面的roomRateReferences换成参考DataTable的枚举即可:

// 假设参考DataTable叫refRateDt
var updatePairs = from targetRow in targetDt.AsEnumerable()
                  join refRow in refRateDt.AsEnumerable()
                  on targetRow.Field<int>("RoomNo") equals refRow.Field<int>("RoomNo")
                  select new 
                  { 
                      TargetRow = targetRow, 
                      NewAmount = refRow.Field<decimal>("Amount") 
                  };

另外如果需要额外判断入住人数是否超过房型最大容量(可选需求),可以在LINQ里加Where条件过滤:

where targetRow.Field<int>("No. of Pax") <= refRate.MaxCapacity

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 07:04:53