从主窗体更新用户控件的控件
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;
}
背景
我有一个带有 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;
}