从主窗体更新用户控件的控件

Update Control on User Control from Main Form

背景

我有一个带有 tableLayoutPanel 的主窗体。在其中我有三个面板,一个页眉、页脚和左侧栏。在剩余的 space 中,我添加并删除了 usercontrols,这个在示例中称为 ctrlmanagepreset

在这些用户控件中,我有控件。即 Listsbox s,我也在尝试添加项目。

我正在从确实包含项目的 xml 文件中获取项目并将它们读入对象列表。然后将每个对象的名称添加到列表框中。

我制作的所有控件都可以访问 public。我认为这可能是由于我创建和添加它们的方式所致?

问题

为什么列表框不更新,显示添加的项目?

代码

创建用户控件的按钮点击事件

 public void btnManage_Click(object sender, EventArgs e)
        {
            tableLayoutPanel.Controls.Add(new ctrlManagePresets () { Dock = DockStyle.Left }, 1, 1);
            PopulateCreateJob();

        }

填充列表框的方法

 public void PopulateCreateJob()
        {

            ctrlManagePresets ctrlmanagepresets = new ctrlManagePresets();

            //read in contents of xml file
            if (File.Exists(JoblistXmlFilepath))
            {

                XmlSerializer deserializer = new XmlSerializer(typeof (List<Favourite>));
                TextReader reader = new StreamReader(JoblistXmlFilepath);

                //create list of old fave objects

                var xmlList = (List<Favourite>) deserializer.Deserialize(reader);

                reader.Close();

                if (xmlList.Count > 0)
                {
                    foreach (Favourite t in xmlList)
                    {
                        //add favourite objects to combobox
                        try
                        {
                            ctrlmanagepresets.lbCreateJob.Items.Add(t.Name);
                        }
                        catch
                        {
                            MessageBox.Show(@"There is an object with no name in the XML.", @"Message",
                                MessageBoxButtons.OK,
                                MessageBoxIcon.Error);
                        }
                    }
                }
                ctrlmanagepresets.lbCreateJob.Refresh();
            }
            else
            {
               ctrlmanagepresets.lbCreateJob.Items.Add(@"Settings File Not Found");
               ctrlmanagepresets.lbCreateJob.Enabled = false;
               ctrlmanagepresets.lbCreateJob.BackColor = Color.DarkRed;
            }
    }

您没有将项目添加到您添加到 tableLayoutPanel 的控件实例中。

只需让您的 PopulateCreateJob return 成为使用 xml 数据构建和初始化的实例

public void btnManage_Click(object sender, EventArgs e)
{
    ctrlManagePresets ctrl = PopulateCreateJob();
    ctrl.Dock = DockStyle.Left; 
    tableLayoutPanel.Controls.Add(ctrl, 1, 1);
}


public ctrlManagePresets PopulateCreateJob()
{
    ctrlManagePresets ctrlmanagepresets = new ctrlManagePresets();
    // current code that initialize the instance of your control
    ....

    // return the control instance initialized to the caller
    return ctrlmanagepresets;
}