Windows Forms中自定义静态类设置Button Enabled属性无效问题
问题原因及解决方案
你的代码核心问题在于:静态方法ButtonSet中创建了一个全新的Form1实例,你修改的是这个未显示的新窗体上的按钮状态,而非当前正在运行、用户能看到的那个窗体对象的按钮,所以界面不会有任何变化。
方法一:传递当前窗体实例到静态方法
修改静态类的ButtonSet方法,让它接收当前运行的Form1实例作为参数,直接操作该实例的按钮:
public static class ButtonEnable { public static void ButtonSet(Form1 currentForm, bool addButton, bool ediButton, bool saveButton, bool deleteButton, bool cancelButton) { currentForm.add_Button.Enabled = addButton; currentForm.edit_Button.Enabled = ediButton; currentForm.save_Button.Enabled = saveButton; currentForm.delete_Button.Enabled = deleteButton; currentForm.cancel_Button.Enabled = cancelButton; } }
在窗体的Load事件中调用时,传递this(代表当前窗体实例):
private void Form1_Load(object sender, EventArgs e) { this.phone_book_TableAdapter.Fill(this.test4DB.phone_book_table); CustomClasses.ButtonEnable.ButtonSet(this, true, false, false, false, false); }
方法二:通过Application.OpenForms获取当前窗体实例
如果不想传递参数,可以通过Application.OpenForms集合找到正在运行的Form1实例:
// 需要添加using System.Linq;引用 public static class ButtonEnable { public static void ButtonSet(bool addButton, bool ediButton, bool saveButton, bool deleteButton, bool cancelButton) { Form1 currentForm = Application.OpenForms.OfType<Form1>().FirstOrDefault(); if (currentForm != null) { currentForm.add_Button.Enabled = addButton; currentForm.edit_Button.Enabled = ediButton; currentForm.save_Button.Enabled = saveButton; currentForm.delete_Button.Enabled = deleteButton; currentForm.cancel_Button.Enabled = cancelButton; } } }
关键注意事项
默认情况下,窗体上的控件访问修饰符是private,静态类无法直接访问。需要在Form1的设计器中,选中每个按钮,在属性面板里修改Modifiers为Internal或Public,这样静态类才能访问这些按钮控件。
内容的提问来源于stack exchange,提问作者Goga Gate
相关产品推荐
相关产品推荐

