C#\无法从另一个用户控制按钮加载用户控制

时间:2019-03-15 10:58:19

标签: c# windows-forms-designer

我正在c#Windows窗体应用程序上测试此代码。这是我正在做的测试。

enter image description here

Panel1有一个“ p1Button”。 “ UserControl1”具有“ uc1Button” 单击“ p1Button”以在Panel1中加载“ UserControl1”
当我在“ uc1Button”上单击事件时,找不到panel2

有可能还是任何建议?

// Form1.cs

using System;
using System.Windows.Forms;

namespace Test
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void p1Button_Click(object sender, EventArgs e)
        {
            if (!panel1.Controls.Contains(UserControl1.Instance))
            {
                panel1.Controls.Add(UserControl1.Instance);
                UserControl1.Instance.BringToFront();
            }
            else
            {
                UserControl1.Instance.BringToFront();
            }
        }
    }
}

// UserControl1.cs

using System;
using System.Windows.Forms;

namespace Test
{
    public partial class UserControl1 : UserControl
    {
        private static UserControl1 _instance;
        public static UserControl1 Instance
        {
            get
            {
                if (_instance==null)
                {
                    _instance = new UserControl1();
                }
                return _instance;
            }
        }
        public UserControl1()
        {
            InitializeComponent();
        }

        private void uc1Button_Click(object sender, EventArgs e)
        {

        }
    }
}

// UserControl2.cs

using System.Windows.Forms;

namespace Test
{
    public partial class UserControl2 : UserControl
    {
        private static UserControl2 _instance;
        public static UserControl2 Instance
        {
            get
            {
                if (_instance == null)
                {
                    _instance = new UserControl2();
                }
                return _instance;
            }
        }
        public UserControl2()
        {
            InitializeComponent();
        }
    }
}

1 个答案:

答案 0 :(得分:0)

首先,您不应该将控件设置为单例。 第二,您必须了解父子边界。

您的父母是表格。窗体有两个孩子-面板。面板1还有另外两个孩子-您的用户控件和一个按钮。您的用户控件还有其他子项-按钮。

因此,如果要在usercontrol1的第二个面板上放置某些内容,则至少有两个选择:

  1. 不好的方法。 这是不好的方法,您不应该这样做,因为它会严格地将用户控件与表单绑定在一起。 您应该从用户控件(即面板)中获取父项,然后从此面板(即表单)中获取父项,然后查看其他面板。

  2. 好方法。 简单又好。将事件处理程序添加到您的用户控件中,例如:

    公共UserControl1:UserControl {    公共事件EventHandler ButtonClicked; }

,然后在您的按钮中单击userControl:

 bind value in lable inside the template filed
 <ItemTemplate>
            <asp:Label ID="Label1" runat="server" Text='<%# Bind("CultivarType") %>'/>
 </ItemTemplate>

 using find control u can get that value
 Label lb = (Label)GridView1.Rows[i].Cells[2].FindControl("Label1");
  string s = lb.Text;

然后,您需要在此处理程序上签名主表单:

ButtonClicked?.Invoke(this, EventArgs.Empty);

您应该阅读有关C#中的委托和事件的更多信息。