我在这里以及与此相关的其他一些网站上环顾四周,并找到了答案。但是,要么解决方案不起作用,要么让我无法理解。当我说“不会工作”时,我会解释我的意思。
我尝试过两种方法。第一个使用get
和set
,第二个只需将控制修饰符设置为true。
当使用其中任何一个时,似乎Form1
的设计器中的值不会更新,因此Form2
仅将值读取为false,因为这是值默认情况下为复选框。
在Form1
:
public bool CheckBox
{
get { return this.checkBox1.Checked; }
//set { this.checkBox1.Checked = value; }
}
private void button1_Click(object sender, EventArgs e)
{
Form2 frm = new Form2();
frm.ShowDialog();
}
在Form2
:
private void button1_Click(object sender, EventArgs e)
{
Form1 frm = new Form1();
if (frm.CheckBox == true)
{
//Do whatever
}
}
这基本上就是我要做的一切。如果我做错了,或者有更好的方法,请告诉我。
谢谢。
答案 0 :(得分:3)
您正在Form
中创建一个新的Form2
实例。它与您当前的Form1
实例完全不同。
相反,您可以将当前的Form1实例传递给ShowDialog
方法,如下所示:
frm.ShowDialog(this);
通过执行此操作,您将Form2
Form1
属性设置为Owner
个实例。因此,您可以使用Form2
Form1
属性访问当前实例。您还应将其强制转换为CheckBox
以访问private void button1_Click(object sender, EventArgs e)
{
if (((Form1)Owner).CheckBox == true)
{
//Do whatever
}
}
属性。
{{1}}
答案 1 :(得分:0)
我猜测这里的问题是你如何使用实例变量。假设我有两种形式 - Form1和Form2,它们的定义如下:
Form1 a = new Form1();
Form2 b = new Form2();
现在稍后在应用程序的生命周期中,用户单击表单2上的按钮 ,你拥有的是(伪代码):
// ... somewhere in "Form2" ...
private void button1_Click(object sender, EventArgs e) {
Form1 c = new Form1();
c.Checkbox = true;
}
问题是“c”与“a”Form1不同 - 它们是同一形式的两个不同实例。解决此问题的最简单方法是使您的复选框保持静态:
// in Form1...
public static bool CheckBox { get; set; }
现在,您只有一个复选框值,并且对于Form1的所有“副本”(实例)都是相同的。
备注强>
这有效,但并不完美。如果你想要Form1的两个副本,并且你们每个人都不具备“CheckBox”的价值,那么这对你不起作用。相反,你需要做的是开始传递实例。因此,我在答案开头列出的代码需要更改为:
Form1 a = new Form1();
Form2 b = new Form2(a);
“Form2”现在定义为:
public class Form2 : System.Windows.Forms.Form {
private Form1 copyOfForm1;
public Form2(Form1 theInstance) {
InitializeComponent();
copyOfForm1 = theInstance;
}
}
现在,您希望从FormB内部访问Form1的一个实例,只需使用“copyOfForm1”变量即可。这是关于实例/静态的所有内容的 FAR ,但希望它至少让你走上正确的轨道。祝你好运!
答案 2 :(得分:0)
在Form2上,将复选框值设为属性。关闭表单时,可以将DialogResult设置为OK。所以在form2的关闭事件或任何你想要的地方:
this.DialogResult = DialogResult.OK;
然后使用以下命令创建,显示和检索复选框值(在关闭时也将处理form2)。当DialogResult正常时,您可以从属性中获取值。
using (var form2 = new Form2())
{
if (form2.ShowDialog() == DialogResult.OK)
{
var checkboxValue = form2.Checkbox;
}
}
如果您不想关闭表单,可以将另一个bool属性设置为true,并在想要获取复选框的值时检查该属性。所以在form2中:
public bool CheckboxSelected { get; set; }
public bool Checkbox { get; set; }
event for Checkbox change:
Checkbox = value of checkbox;
CheckboxSelected = true;
然后在Form1上你可以看到CheckboxSelected == true:
using (var form2 = new Form2())
{
if (form2.CheckboxSelected == true)
{
var checkboxValue = form2.Checkbox;
}
}
答案 3 :(得分:0)
更轻松的解决方案:
Form1:
(选中此复选框时运行的代码)
if(CheckBox1.Checked == true)
{
File.WriteAllText("C:\\Checked.txt", "true");
}
Form2:
(加载表单时运行的代码)
string GetResult = File.ReadLines("C:\\Checked.txt").First();
if(GetResult == "true")
{
///Any Code Here///
}