当子窗体中的按钮被点击时,如何刷新父窗体?

5

然后关闭子窗体可以使用以下命令:

private void listView1_MouseDoubleClick(object sender, EventArgs e)
{
    ListViewItem item = listView1.SelectedItems[0];
    string s = item.SubItems[6].Text;
    q = m;
    CommercialOfferEditProperties ob = new CommercialOfferEditProperties(s, q);
    ob.FormClosed += new FormClosedEventHandler(ob_FormClosed);
    ob.Show(); //show child
}

void ob_FormClosed(object sender, FormClosedEventArgs e)
{
   some action
}

但是当子窗体中的按钮被点击时,如何运行 ob_FormClosed 动作或创建新动作?


什么是CommercialOfferEditProperties类?它没有OnClick事件吗?你有访问权限吗? - Amittai Shapira
CommercialOfferEditProperties是一个子窗体。 - Ignas
如果这是你的类,你可以添加公共的Clicked事件,并让父级订阅它,或者在构造函数中传递要执行的Action。 - Amittai Shapira
3个回答

9
  1. 给你的子窗体(CommercialOfferEditProperties)添加一个OnClick事件。
  2. 在父窗体中订阅该事件。
  3. 每次点击子窗体按钮时触发OnClick事件。

这样,您就能够通知父窗体了。

示例:

//Child form declaration

public class CommercialOfferEditProperties:Form
{

public event EventHandler ButtonClicked;

public void NotifyButtonClicked(EventArgs e)
{
       if(ButtonClicked != null)
       ButtonClicked(this,e);

}

...

}

母表单:

private void listView1_MouseDoubleClick(object sender, EventArgs e)
        {
            ListViewItem item = listView1.SelectedItems[0];
            string s = item.SubItems[6].Text;
            q = m;
            CommercialOfferEditProperties ob = new CommercialOfferEditProperties(s, q);
            ob.FormClosed += new FormClosedEventHandler(ob_FormClosed);
            ob.ButtonClicked += new EventHandler(ob_ButtonClicked);
            ob.Show(); //show child
        }

        void ob_FormClosed(object sender, FormClosedEventArgs e)
        {
           //process form close
        }

        void ob_ButtonClicked(object sender, EventArgs e)
        {
           //process button clicked
        }

2

您可以将按钮声明为公共的或(更好的方法)创建一个只读属性,公开暴露您的按钮。

public Button TheButton { get { return button1; } }

然后执行。
ob.TheButton.Clicked += new ....

无法工作,因为您无法从父窗口订阅按钮事件。对于父窗口来说,子窗体只是一个窗体。在初始化时,它不知道放置在其上的控件是什么。 - Maxim V. Pavlov
哦,他从Form继承并重新定义了它的结构。好吧,也许是我错了。 - Maxim V. Pavlov
你需要在初始化之后进行操作。在父类中: var child = new ChildForm(); child.TheButton.Clicked += ... - Olivier Jacot-Descombes
记住,Form只是一个类,仅仅是一个类。 - Olivier Jacot-Descombes

0

我相信你正在错误的位置尝试这样做... 然而,实现你想要的唯一方法是在构造函数中将父控件传递给子控件或将其设置为属性(由于不同原因,这两种方法都不是好主意),或者你可以添加一个事件,你的父窗体注册该事件。然后调用Parent.Refresh()方法。

你应该有一些类似于父窗体中的代码:

ChildDialog dialog = new ChildDialog();
dialog.ShowDialog(this);

你可以添加以下代码:

if(dialog.DialogResult == DialogResult.OK)
{
   this.Refresh();
}

注意:Dialog.OK 根据子窗体的对话框结果可能需要更改。

如果您有一个MDI子窗体,那么this.Parent属性会被设置,您可以调用:Parent.Refresh(); - Olivier Jacot-Descombes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接