C# 即使被告知显示,标签也不会显示
我正在制作一个应用程序,加载一个单独的表单,用户输入信息,完成后,它将显示在应用程序首先加载的主表单上 问题是,我尝试了多种解决方案来加载此文件,但在输入信息后将无法加载。我尝试了这个.Controls.Add(标签)这是我见过最多的,但它没有起作用。我尝试的另一种方法是做Label.Show(),但结果相同,没有显示任何内容。下面的添加联系人(字符串名称)方法是我添加联系人的方式 AddContact\u Click(objectsender,EventArgs e)方法是一个按钮,按下该按钮时,会打开另一个表单,允许插入信息C# 即使被告知显示,标签也不会显示,c#,winforms,C#,Winforms,我正在制作一个应用程序,加载一个单独的表单,用户输入信息,完成后,它将显示在应用程序首先加载的主表单上 问题是,我尝试了多种解决方案来加载此文件,但在输入信息后将无法加载。我尝试了这个.Controls.Add(标签)这是我见过最多的,但它没有起作用。我尝试的另一种方法是做Label.Show(),但结果相同,没有显示任何内容。下面的添加联系人(字符串名称)方法是我添加联系人的方式 AddContact\u Click(objectsender,EventArgs e)方法是一个按钮,按下该按钮
public partial class Phonebook : Form
{
public Phonebook()
{
InitializeComponent();
MaximumSize = new Size(633, 306);
}
private void AddContact_Click(object sender, EventArgs e)
{
MakeContact MC = new MakeContact();
MC.Show();
}
public void AddContacts(string Name)
{
Label name = new Label();
//Added Style and Location of Label...
name.Text = Name;
name.Location = new Point(98, 13);
name.Font = new Font("Microsoft Sans Serif", 13, FontStyle.Bold);
this.Controls.Add(name);
Refresh();
}
}
下面是我在按下Finish按钮时使用的方法,例如当用户处理完信息后,然后调用AddContacts()方法
public partial class MakeContact : Form
{
public MakeContact()
{
InitializeComponent();
MaximumSize = new Size(394, 377);
}
private void FinishContact_Click(object sender, EventArgs e)
{
//FullName is the name of the TextField when asking for a name
string Name = FullName.Text;
Phonebook PB = new Phonebook();
PB.AddContacts(Name);
//Closes Separate Form and goes back to the
Close();
}
}
期望:
信息输入后,应将标签加载到表单中
实际:
它不会显示出曾经发生过的事情
编辑:在代码和问题中添加了更多内容,因为我没有很好地提出这个问题,对此表示抱歉:/我在评论中描述了一个示例: 执行此操作时:
Phonebook PB = new Phonebook();
您为PhoneBook
类(您的表单)创建了一个新实例:这不是创建MakeContact
表单和您尝试更新的表单实例(同一对象)它是另一个对象无论您对这个新对象做了什么更改,它都不会反映在原来的现有对象中 如何解决:
将构造函数添加到
MakeContact
窗体,该窗体接受类型为电话簿的参数和类型为电话簿的私有对象:
private PhoneBook pBook = null;
public MakeContact() : this(null) { }
public MakeContact(PhoneBook phoneBook)
{
InitializeComponent();
this.pBook = phoneBook;
}
将构造函数中传递的参数指定给相同类型的私有字段。然后,此字段将用于调用PhoneBook
类的公共方法(表单是一个类,行为类似于其他类)
这不是唯一可能的方法。你可以看到
完整示例代码:
public partial class Phonebook : Form
{
private void AddContact_Click(object sender, EventArgs e)
{
MakeContact MC = new MakeContact(this);
MC.Show();
}
public void AddContacts(string Name)
{
Label name = new Label();
// (...)
this.Controls.Add(name);
}
}
public partial class MakeContact : Form
{
private PhoneBook pBook = null;
public MakeContact() : this(null) { }
public MakeContact(PhoneBook phoneBook)
{
InitializeComponent();
this.pBook = phoneBook;
}
private void FinishContact_Click(object sender, EventArgs e)
{
string Name = FullName.Text;
this.pBook?.AddContacts(Name);
this.Close();
}
}
谁调用AddContacts
方法?表单上是否有其他控件?在添加到表单之前,您没有设置标签的位置。因此,标签可能隐藏在表单上的其他控件后面。您也没有设置标签的文本属性。您似乎正在从电话簿
表单创建一个新的MakeContact
表单。但是,在MakeContact
表单中,您尝试调用新Phonebook
表单的AddContacts
方法:您对此新实例所做的任何更改都不会影响原始表单。创建时需要将Phonebook
的当前实例传递给MakeContact
表单的构造函数,以便此新表单可以使用Phonebook
的当前实例。在这种情况下,调用Phonebook
的公共方法将产生您期望的结果;公共MakeContact(电话簿电话簿){this.pb=PhoneBook}
。在FinishContact\中单击
:{this.pb.AddContacts(Name);}
嘿,很抱歉反应太晚。我理解你的意思,我尝试了一下你的例子,但是当我这么做的时候,我得到一个错误,当我调用MakeContact
,它需要一个参数,它是Phoneboook phoneBook
。我想你的意思是把Phonebook电话簿放在我有InitializeComponent()的地方
,但即使我使用了另一种方法,它也会给我一个NullReferenceException
,可能我没有正确地理解您,对此我很抱歉,因为我对该语言非常陌生。我现在非常感谢您,这对我来说非常好。