【问题标题】:Main form fields only display data of first item selected within listbox主表单字段仅显示在列表框中选择的第一个项目的数据
【发布时间】:2017-02-06 03:39:48
【问题描述】:

我有两个表单需要相互交互。父窗体有 4 个字段和一个添加按钮,用于将每个字段中的数据保存到类对象的实例中。将其保存到对象后,该对象将存储在子窗体包含的列表框中。我创建了一个自定义事件来处理这些东西,但我肯定做错了什么。

应该发生的是,当两个窗口都打开并且列表框中有数据时,从子表单列表框中选择的任何项目都会使用来自该对象的数据填充父表单字段。当我测试我的代码时,只有第一项具有正确填写正确字段的数据。如果我在第一次选择后单击任何其他项目,则主表单字段根本不会更新。

针对我的问题,子表单具有以下代码:

public EventHandler ListBoxItemClicked;
private void pPotionList_SelectedIndexChanged(object sender, EventArgs e)
{
    PotionForm tempMain = new PotionForm(); //this was a test, nothing changed
    pPotionList.SelectionMode = SelectionMode.One;
    if (ListBoxItemClicked != null)
    {
        ListBoxItemClicked(this, new EventArgs());
    }
    tempMain.Refresh();      // this too
}

父窗体有这些代码

private void pListDisplay_Click(object sender, EventArgs e)
{
    PotionList secForm = new PotionList();

    secForm.secFormBox.DataSource = potionBindList;

    PotionListChanged += secForm.HandlePotionListChanged;

    secForm.ChildPotionListChanged += HandleChildPotionListChanged;

    secForm.ListBoxItemClicked += HandleListBoxItemClicked; //this line

    secForm.Show();
}

public void HandleListBoxItemClicked(object sender, EventArgs e)
{
    pTypeInput.SelectedItem = aPotion._type;
    pMagInput.Value = aPotion._magnitude;
    pNameInput.Text = aPotion._name;
    pBonusInput.Checked = aPotion._bonus;
}

如果相关,我目前正在使用 Visual Studio Community 2015。

【问题讨论】:

  • 需要更多信息!:PotionForm tempMain 是什么?父母 ListBox 的名字是什么? secForm.secFormBox 是什么? potionBindList 是什么类型的?
  • aPotion 在哪里初始化?
  • PotionForm tempMain 这是父表单的一个实例,我试图用它来刷新主表单,以便在选择所选项目时可以使用新信息刷新它。 secForm.secFormBox 这是子窗体的一个实例,也是子窗体的列表框。 potionBindList这是BindingList<T>
  • aPotionpublic partial class PotionForm : Form { } 内初始化
  • 到目前为止,它看起来就像您将在子控件中刷新一个全新的 PotionForm 实例,而不是您看到的打开窗口的实例。您是否尝试过在父窗体的HandleListBoxItemClicked 方法中调用this.Refresh()?从您发布的代码中也不清楚aPotion 的值如何变化。 “用来自该对象的数据填充父表单字段”该部分在您发布的代码中完全丢失。

标签: c# winforms


【解决方案1】:

好的,在看到所有必要的代码后,我会说问题是您永远不会将值从 Child-Form 传递给 Parent。每当触发事件HandleListBoxItemClicked 时,只会将aPotion 的初始值写入控件。

作为一种解决方案,我建议在子窗体中触发 ListBoxItemClicked 事件时将 SelectedItem 作为发件人:

儿童

public EventHandler ListBoxItemClicked;
private void pPotionList_SelectedIndexChanged(object sender, EventArgs e)
{
    Potion p = pPotionList.SelectedItem as Potion;

    pPotionList.SelectionMode = SelectionMode.One;
    if (p != null)
    {                
        if (ListBoxItemClicked != null)
        {
            ListBoxItemClicked(p, new EventArgs());
        }    
    }
}

您不能在父表单中使用此信息并随意散布信息:

家长

public void HandleListBoxItemClicked(object sender, EventArgs e)
{
    Potion p_parent = sender as Potion;

    if(p_parent != null)
    {      
        pTypeInput.SelectedItem = p_parent._type;
        pMagInput.Value = p_parent._magnitude;
        pNameInput.Text = p_parent._name;
        pBonusInput.Checked = p_parent._bonus;
    }
}

现在应该不需要刷新或其他任何操作。希望对你有帮助

【讨论】:

  • 这确实有效,谢谢!我不得不在 HandleListBoxItemClicked 方法中用 p_parent 替换 p 。我认为这是一个小错字?
  • @NerveSinge 是的,那是一种类型。我在最后一分钟想,如果我在两种方法p 中调用变量可能会造成混淆,所以我更改了它,但显然只在声明中。很高兴听到它有帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-14
  • 2014-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多