-1

@Mark,是的,先生,我在用户控件中创建了一个事件。这是我的代码:

用户控制

namespace Purchase_Order
{
    public partial class Static : UserControl
    {
        public event EventHandler ClassificationClicked;
        public Static()
        {
            InitializeComponent();
        }

        private void btnClassification_Click(object sender, EventArgs e)
        {
            ClassificationClicked(sender, e);
        }
    }
}

主窗体

public partial class formMain : Form
{

    public formMain()
    {
        InitializeComponent();
        Static.ClassificationClicked += new EventHandler(Static_ClassificationClicked); 
    }

    private void formMain_Load(object sender, EventArgs e)
    {
        Static control = new Static();
        panelSide.Controls.Clear();
        panelSide.Controls.Add(control);   
    }

    void  Static_ClassificationClicked(object sender, EventArgs e)
    {
        classification control = new classification();
        panelMain.Controls.Clear();
        panelMain.Controls.Add(control);
    }

}

这是错误-> Static.ClassificationClicked += new EventHandler(Static_ClassificationClicked);

4

3 回答 3

1

就我个人而言,我会在您的 UserControl 上创建一个事件并在您的 MainForm 中订阅它。在我看来,UserControl 了解父表单是不合适的。像这样的东西:

将事件添加到您的 UserControl:

public partial class UserControl1 : UserControl
{
    public event EventHandler ClassificationClicked;
    public UserControl1()
    {
        InitializeComponent();
    }

    private void btnClassification_Click(object sender, EventArgs e)
    {
        ClassificationClicked(sender, e);
    }
}

在您的 MainForm 中订阅它

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        userControl11.ClassificationClicked += new EventHandler(userControl11_ClassificationClicked);
    }

    void userControl11_ClassificationClicked(object sender, EventArgs e)
    {
        classification control = new classification();
        panelMain.Controls.Clear();
        panelMain.Controls.Add(control);

    }
}

根据评论流进行编辑。我还将确保您的用户控件具有唯一的名称,而不仅仅是控件,这样您就可以区分它们。

public partial class formMain : Form
{
    Static staticControl;
    Classification classificationControl;

    public formMain()
    {
        InitializeComponent();
        staticControl= new Static();
        panelSide.Controls.Clear();
        panelSide.Controls.Add(staticControl);
        staticControl.ClassificationClicked += new EventHandler(Static_ClassificationClicked); 
    }

    void  Static_ClassificationClicked(object sender, EventArgs e)
    {
        classificationControl = new classification();
        panelMain.Controls.Clear();
        panelMain.Controls.Add(classificationControl);
    }

}
于 2013-04-25T02:54:04.517 回答
1

我假设这btnClassification_Click是您的用户控件上的一个方法static,它位于您的formMain.

您的问题是,在您的btnClassification_Click方法中,您创建了一个新的formMain类实例,而不是访问您的static用户控件所在的实例。mainPanel看起来你已经在类中公开了formMain,所以你只需要找到formMain类的正确实例来添加你的用户控件。为此,请将此方法放在您的static用户控件中:

private Form GetParentForm()
{
    Control current = this.Parent;
    while (current != null)
    {
        Form form = current as Form;
        if (form != null)
        {
            return form;
        }

        current = current.Parent;
    }

    return null;
}

然后从您的事件处理程序调用此方法:

private void btnClassification_Click(object sender, EventArgs e)
{
    classification control = new classification();
    formMain main = (formMain)this.GetParentForm();
    main.panelMain.Controls.Clear();
    main.panelMain.Controls.Add(control);
}
于 2013-04-25T00:51:07.417 回答
0

Mark Hall 的回答是最好的,但是我想补充一点,您不应该直接引发事件,而是首先检查是否有订阅者然后引发事件。如果还没有人订阅该事件,这将停止一个空引用异常。

public partial class UserControl1 : UserControl
{
    public event EventHandler ClassificationClicked;
    public UserControl1()
    {
        InitializeComponent();
    }

    private void btnClassification_Click(object sender, EventArgs e)
    {
        RaiseClassifactionClicked();
    }

    private RaiseClassifactionClicked()
    {
        var tmp = ClassificationClicked; //This is added for thread safty
        if(tmp != null) //check to see if there are subscribers, if there are tmp will not be null
           tmp(this, EventArgs.Empty); //You don't need to pass along the sender and e, make your own here.
    }
}

有关线程安全技巧的更多信息,请阅读这篇文章

于 2013-04-26T02:34:15.283 回答