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

Datagridview已设为Public但其他窗体仍提示不存在怎么解决

错误原因
  • appointmentDgv是Form1类的成员控件,即使你将它的访问权限设置为Public,也必须通过Form1的实例对象才能访问,Form2的代码上下文默认没有定义该控件,直接写控件名调用就会触发does not exist in current context报错。
解决方案

方案1:传递Form1实例到Form2(新手易上手)

  1. 调整Form2的代码,新增接收Form1实例的构造逻辑:
// Form2类内定义私有字段存储Form1实例
private Form1 _mainForm;

// 替换Form2原有默认构造函数
public Form2(Form1 mainForm)
{
    InitializeComponent();
    _mainForm = mainForm;
}
  1. 修改Form1中打开Form2的代码,将当前Form1实例传入:
// Form1内触发打开Form2的位置写如下代码
Form2 editForm = new Form2(this);
editForm.Show();
  1. 替换Form2中原有的取值代码,通过存储的Form1实例访问控件:
// 用_mainForm访问Form1的公共控件
var selectedAppointmentId = _mainForm.appointmentDgv.CurrentRow.Cells[0].Value;
Appointment appointment = new Appointment();
// 建议用ToString()替代强制string转换,避免值类型转换报错
appointment.AppointmentID = int.Parse(selectedAppointmentId.ToString());

方案2:直接传递选中ID到Form2(更推荐,耦合度更低)

不需要把控件设置为Public,直接在Form1侧取到需要的ID再传给Form2,避免窗体间控件直接依赖:

  1. 调整Form2的构造函数,接收预约ID参数:
// Form2类内定义私有字段存储传过来的ID
private int _selectedAppointmentId;

public Form2(int appointmentId)
{
    InitializeComponent();
    _selectedAppointmentId = appointmentId;
}
  1. Form1打开Form2时先取值再传递:
// Form1内打开Form2的代码
int selectId = int.Parse(appointmentDgv.CurrentRow.Cells[0].Value.ToString());
Form2 editForm = new Form2(selectId);
editForm.Show();
  1. Form2内直接使用存储的ID即可,不需要再访问Form1控件:
Appointment appointment = new Appointment();
appointment.AppointmentID = _selectedAppointmentId;

注意:访问CurrentRow前建议增加判空逻辑,判断CurrentRow != null后再执行取值操作,避免用户未选中行时触发空引用异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 16:15:03