【问题标题】:Open up Windows Form from within another Windows Form and detect button click从另一个 Windows 窗体中打开 Windows 窗体并检测按钮单击
【发布时间】:2017-07-28 16:18:46
【问题描述】:

我目前正在学习如何使用 Windows 窗体。我有一个控制一切的主 Windows 窗体 (MainForm)。在执行过程中的某个时刻,我想打开另一个 Windows 窗体,其中包含一个列表框 (ListboxForm) 和一个按钮 (DoneButton),用于指示用户何时完成了 ListboxForm。我已经设法让 ListboxForm 显示出来,但我不确定如何让 MainForm 在用户按下 DoneButton 后等待并继续执行。

现在,当 ListboxForm 弹出并且用户单击 DoneButton 时,仍然显示 ListboxForm 并且没有任何反应。我不确定为什么会这样——我在 DoneButton 的按钮代码中有一个 this.close。

这是我的 ListboxForm 代码:​​

public partial class ListboxForm : Form
{
    List<string> _items = new List<string>();

    public UpdateGhubAndWebConfigForm()
    {
        InitializeComponent();

        _items.Add("Option 1");
        _items.Add("Option 2");
        _items.Add("Option 3");

        listBox1.DataSource = _items;
    }

    private void listBox1_SelectedIndexChanged(object sender, EventArgs e) { }

    // This is for 'DoneButton'
    private void button1_Click(object sender, EventArgs e)
    {
        LoggingProvider.Log.Info("ListboxForm DoneButton clicked with index: " + listBox1.SelectedIndex.ToString());

        DoStuff();

        this.Close();
    }

    private void Form1_Load(object sender, EventArgs e) { }

    private void label1_Click(object sender, EventArgs e) { }

    public static void DoStuff() { }
}

然后 MainForm 像这样打开/创建一个 ListboxForm:

if(displayListboxForm == true)
{
    var listboxForm = new ListboxForm();
    listboxForm.ShowDialog();

    // Now I want MainForm to wait until the user clicks DoneButton in ListboxForm
    MessageBox.Show("User has selected an option from ListboxForm");
}

【问题讨论】:

  • ListBoxForm是如何从MainForm触发的?你可以发布整个方法吗?在单击完成按钮后,我没有看到任何会导致 ListBoxForm 保持显示的异常情况。
  • 它包含在一个任务中。文章底部显示了触发 ListboxForm 的块。
  • DoneButton 的按钮点击事件真的触发了吗?您的日志条目是否已创建?
  • 在 ListBoxForm 的设计器中验证 DoneButton 的点击事件实际上是由 button1_Click 方法处理的。
  • 是的,复制表单会导致异常。正确设置它们并触发事件后,如果您仍然需要帮助使其成为 MainForm 的模态,请告诉我

标签: c# forms winforms windows-forms-designer


【解决方案1】:

如果您想监听表单的任何事件,您需要订阅该委托,基本上,您的 MainForm 会创建您的 ListboxForm 的一个实例,该实例具有您想要单击的按钮。公开按钮的可见性

public Button button1....

然后从你的方法订阅事件

if(displayListboxForm == true)
{
    var listboxForm = new ListboxForm();
    //subscribing to the click event
    listboxForm.button1.Click += YourMethod;
    listboxForm.ShowDialog();

    // Now I want MainForm to wait until the user clicks DoneButton in ListboxForm
    MessageBox.Show("User has selected an option from ListboxForm");
}

public void YourMethod(EventArgs e)
{
   //your logic here when the button is clicked
}

希望对你有帮助

【讨论】:

  • 感谢您的回复。不过我有点困惑。您的“公共按钮 button1”是如何工作的?这如何链接到 ListboxForm 中显示的实际按钮。 ListboxForm 中的按钮名称为“DoneButton”(我可以通过 Intellisense 找到它)。有没有办法将“public Button button1”连接到“DoneButton”?
  • @Roka545 是 DoneButton,我从你放的代码中取了名字,但它应该作为一个部分类生成,你在设计器上放置的所有变量都会生成,将其访问权限更改为公开
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-11
  • 2011-05-19
  • 2015-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多