C# 即使被告知显示,标签也不会显示

C# 即使被告知显示,标签也不会显示,c#,winforms,C#,Winforms,我正在制作一个应用程序,加载一个单独的表单,用户输入信息,完成后,它将显示在应用程序首先加载的主表单上 问题是,我尝试了多种解决方案来加载此文件,但在输入信息后将无法加载。我尝试了这个.Controls.Add(标签)这是我见过最多的,但它没有起作用。我尝试的另一种方法是做Label.Show(),但结果相同,没有显示任何内容。下面的添加联系人(字符串名称)方法是我添加联系人的方式 AddContact\u Click(objectsender,EventArgs e)方法是一个按钮,按下该按钮

我正在制作一个应用程序,加载一个单独的表单,用户输入信息,完成后,它将显示在应用程序首先加载的主表单上

问题是,我尝试了多种解决方案来加载此文件,但在输入信息后将无法加载。我尝试了这个.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
,可能我没有正确地理解您,对此我很抱歉,因为我对该语言非常陌生。我现在非常感谢您,这对我来说非常好。