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

DataGridView日期匹配今日时触发提示锁控件及求和存储实现问询

实现方案

1. 新增隐藏列Patient Renewal

在窗体初始化或DataGridView数据绑定前添加该隐藏列,代码如下:

// 窗体Load事件中添加逻辑
private void Form1_Load(object sender, EventArgs e)
{
    DataGridViewTextBoxColumn renewalCol = new DataGridViewTextBoxColumn();
    renewalCol.Name = "Patient Renewal";
    renewalCol.HeaderText = "Patient Renewal";
    renewalCol.Visible = false; // 设置为隐藏状态
    DGVPatient.Columns.Add(renewalCol);
    
    // 其余原有数据绑定逻辑...
}

2. 绑定选中行变更事件

给DGVPatient绑定SelectionChanged事件,所有核心逻辑都在该事件中实现,同时增加边界校验避免程序崩溃:

private void DGVPatient_SelectionChanged(object sender, EventArgs e)
{
    // 无选中行时直接返回
    if (DGVPatient.SelectedRows.Count == 0) return;
    DataGridViewRow selectedRow = DGVPatient.SelectedRows[0];
    
    // --------------------------
    // 第一部分:数值计算与存储
    // --------------------------
    int originalValue = 0;
    int inputValue = 0;
    // 校验数值合法性,避免格式错误抛出异常
    if (selectedRow.Cells[7].Value != null 
        && int.TryParse(selectedRow.Cells[7].Value.ToString(), out originalValue)
        && int.TryParse(TxtEntry.Text, out inputValue))
    {
        int sumResult = originalValue + inputValue;
        // 计算结果存入隐藏列
        selectedRow.Cells["Patient Renewal"].Value = sumResult;
    }
    else
    {
        // 可选:数值不合法时的提示逻辑
        // MessageBox.Show("输入值或原始数据不是合法数字,请检查");
        return;
    }
    
    // --------------------------
    // 第二部分:日期校验与控件锁定
    // --------------------------
    // 优先转DateTime类型对比,避免直接ToString因格式差异导致判断错误
    if (selectedRow.Cells["Entry Date"].Value != null 
        && DateTime.TryParse(selectedRow.Cells["Entry Date"].Value.ToString(), out DateTime entryDate))
    {
        if (entryDate.Date == DateTime.Today.Date)
        {
            // 弹出警告
            MessageBox.Show("当前选中患者的登记日期为今日,所有操作已锁定", "操作警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            // 调用方法锁定所有控件
            LockAllControls(this);
        }
    }
}

3. 补充控件锁定通用方法

新增递归方法处理容器内所有子控件的锁定逻辑:

private void LockAllControls(Control parent)
{
    foreach (Control ctl in parent.Controls)
    {
        ctl.Enabled = false;
        // 如果是Panel、GroupBox等容器控件,递归处理内部子控件
        if (ctl.HasChildren)
        {
            LockAllControls(ctl);
        }
    }
}

注意事项:

  • 列索引7请确认和你实际的列顺序一致,避免取错数据
  • 后续需要解锁控件时,可对应写UnlockAllControls方法,把Enabled属性赋值为true即可
  • 使用TryParse替代直接Parse可以避免空值、格式错误导致的程序崩溃

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 02:00:01