Datagridview已设为Public但其他窗体仍提示不存在怎么解决
错误原因
appointmentDgv是Form1类的成员控件,即使你将它的访问权限设置为Public,也必须通过Form1的实例对象才能访问,Form2的代码上下文默认没有定义该控件,直接写控件名调用就会触发does not exist in current context报错。
解决方案
方案1:传递Form1实例到Form2(新手易上手)
- 调整Form2的代码,新增接收Form1实例的构造逻辑:
// Form2类内定义私有字段存储Form1实例 private Form1 _mainForm; // 替换Form2原有默认构造函数 public Form2(Form1 mainForm) { InitializeComponent(); _mainForm = mainForm; }
- 修改Form1中打开Form2的代码,将当前Form1实例传入:
// Form1内触发打开Form2的位置写如下代码 Form2 editForm = new Form2(this); editForm.Show();
- 替换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,避免窗体间控件直接依赖:
- 调整Form2的构造函数,接收预约ID参数:
// Form2类内定义私有字段存储传过来的ID private int _selectedAppointmentId; public Form2(int appointmentId) { InitializeComponent(); _selectedAppointmentId = appointmentId; }
- Form1打开Form2时先取值再传递:
// Form1内打开Form2的代码 int selectId = int.Parse(appointmentDgv.CurrentRow.Cells[0].Value.ToString()); Form2 editForm = new Form2(selectId); editForm.Show();
- Form2内直接使用存储的ID即可,不需要再访问Form1控件:
Appointment appointment = new Appointment(); appointment.AppointmentID = _selectedAppointmentId;
注意:访问
CurrentRow前建议增加判空逻辑,判断CurrentRow != null后再执行取值操作,避免用户未选中行时触发空引用异常。
内容的提问来源于stack exchange,提问作者Matthew Columbia
相关产品推荐
相关产品推荐

