我是C#的新手,我有一个小项目。我被困在某个地方。我在这里解释了它(带有示例源代码):
我有一个表单应用程序。我要求用户从2个按钮中选择一个选项。有2个按钮(是和否)。我的代码是这样的:
public partial class Form1 : Form
{
public int choice=0;
public Form1()
{
if(choice == 0)
{
label.Text = "Please push one of these buttons :";
// And there are buttons below this label
}
else if(choice == 1)
{
label.Text = "You just pushed YES button";
}
else if(choice == 2)
{
label.Text = "You just pushed NO button";
}
}
private void buttonYes_Click(object sender, EventArgs e)
{
choice = 1;
/*
I have to use one of these here for redraw whole form
this.Refresh();
this.Invalidate();
*/
}
private void buttonNo_Click(object sender, EventArgs e)
{
choice = 2;
/*
I have to use one of these here for redraw whole form
this.Refresh();
this.Invalidate();
*/
}
}
如您所见,当用户单击YES或NO按钮之一时,应重新执行整个构造函数。标签应为“你只需按下YES / NO按钮”。
但是当我使用this.Refresh()时,当我按下按钮时没有任何事情发生。仍然标签是“请按下其中一个按钮:”。
当我使用this.Invalidate()时,所有按钮都消失,标签仍然是“请按下其中一个按钮:”。
我该怎么办?
感谢。
PS 我发现this question之后才问这个。但是如你所见,接受的答案对我不起作用。
答案 0 :(得分:6)
无效或刷新不会再次调用构造函数。在创建表单时,构造函数只调用一次,而无效则不会创建新表单。把改变东西的逻辑放在另一个方法中,然后从构造函数和事件处理程序中调用它 - 但请注意后代调用实例方法或从构造函数中访问变量并不是最好的方法 - 但是对于你的目的就是简单的解决方案。
public partial class Form1 : Form
{
public int choice=0;
public Form1()
{
UpdateForm();
}
private void UpdateForm(){
if(choice == 0)
{
label.Text = "Please push one of these buttons :";
// And there are buttons below this label
}
else if(choice == 1)
{
label.Text = "You just pushed YES button";
}
else if(choice == 2)
{
label.Text = "You just pushed NO button";
}
}
private void buttonYes_Click(object sender, EventArgs e)
{
choice = 1;
/*
I have to use one of these here for redraw whole form
this.Refresh();
this.Invalidate();
*/
UpdateForm();
}
private void buttonNo_Click(object sender, EventArgs e)
{
choice = 2;
/*
I have to use one of these here for redraw whole form
this.Refresh();
this.Invalidate();
*/
UpdateForm();
}
}
答案 1 :(得分:3)
如果你想保留与例子中相同的变量,这是最好的选择。如果您想要更短的版本,只需直接在Form1 Constructor
中更改标签即可。
public partial class Form1 : Form
{
public int choice=0;
public Form1()
{
buttonYes.Click += (s,e) => {
choice = 1;
ChangeText(choice);};
buttonNo.Click += (s,e) => {
choice = 2;
ChangeText(choice);};
}
private void ChangeText(int userChoice)
{
if(choice == 0)
label.Text = "Please push one of these buttons :";
else if(choice == 1)
label.Text = "You just pushed YES button";
else if(choice == 2)
label.Text = "You just pushed NO button";
}
}
缩短版本
public partial class Form1 : Form
{
public Form1()
{
label.Text = "Push a button";
buttonYes.Click += (s,e) => {label.Text = "Yes is pressed";};
buttonNo.Click += (s,e) => {label.Text = "No is pressed";};
}
}
答案 2 :(得分:3)
这就是你应该如何做到的:
public partial class Form1 : Form
{
public Form1()
{
// Isn't there supposed to be InitializeComponent() here?
// You should assign this in the designer, rather than here.
label.Text = "Please push one of these buttons :";
}
private void buttonYes_Click(object sender, EventArgs e)
{
label.Text = "You just pushed YES button";
}
private void buttonNo_Click(object sender, EventArgs e)
{
label.Text = "You just pushed NO button";
}
}
由于所有按钮正在进行更改标签,因此应该直接进行,而不是更改变量并刷新。
但为什么不按我的方式工作?
所有刷新和无效都会重绘表单上已有的内容。他们不会重新创建它。
构造函数用于在创建对象时初始化对象一次。它不能被称为“重新初始化”或“刷新”对象。
为避免涉及太多细节,我建议您找一篇关于面向对象编程的文章/书籍,以了解有关构造函数和其他OOP习语的更多信息。
答案 3 :(得分:0)
主构造函数在创建新对象时执行。
使用方法执行此操作。而我是岸上这将工作
public string TextSwitcher(int choice)
{
Switch(choice) // choice is an int
{
// 1,2,3 is not an serial no they will pass by parameter
case(1):
return "Please push one of these buttons :";
brake;
case(2):
return = "You just pushed YES button";
brake;
case(3)
return = "You just pushed NO button";
brake;
}
}
private void buttonYes_Click(object sender, EventArgs e)
{
label.Text = TextSwitcher(2);
}
private void buttonNo_Click(object sender, EventArgs e)
{
label.Text = TextSwitcher(3);
}
我跳这会对你有所帮助。并欢迎你的谢意。
祝你好运