Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在C中使用DynamicGroupBox中的Click事件#_C#_Winforms - Fatal编程技术网

C# 如何在C中使用DynamicGroupBox中的Click事件#

C# 如何在C中使用DynamicGroupBox中的Click事件#,c#,winforms,C#,Winforms,我有一张这样的表格。您可以在右侧的Flowlayout中看到我的动态groupbox(30 groupbox),在左侧可以看到一个显示问题的图片框。 我在琢磨如何在Picturebox中为每个groupbox使用Click事件来显示等价的问题 这是我的groupbox代码 public GroupBox gbx(String name, int s, string i, string msch) { this.Name = int.Parse(i);

我有一张这样的表格。您可以在右侧的Flowlayout中看到我的动态groupbox(30 groupbox),在左侧可以看到一个显示问题的图片框。 我在琢磨如何在Picturebox中为每个groupbox使用Click事件来显示等价的问题

这是我的groupbox代码

        public GroupBox gbx(String name, int s, string i, string msch)
    {
        this.Name = int.Parse(i);
        this.sda = s;
        this.MsCauHoi = msch;

        // gb
        // 
        if (s == 2)
        {
            gb.Controls.Add(cb1);
            gb.Controls.Add(cb2);

        }
        if (s == 3)
        {
            gb.Controls.Add(cb1);
            gb.Controls.Add(cb2);
            gb.Controls.Add(cb3);
        }
        if (s == 4)
        {
            gb.Controls.Add(cb1);
            gb.Controls.Add(cb2);
            gb.Controls.Add(cb3);
            gb.Controls.Add(cb4);
        }

        gb.Location = new System.Drawing.Point(219, 44);
        gb.Margin = new System.Windows.Forms.Padding(1, 1, 1, 1);
        gb.Name = name;
        gb.Padding = new System.Windows.Forms.Padding(1, 1, 1, 1);
        gb.Size = new System.Drawing.Size(120, 45);
        gb.TabIndex = 7;
        gb.TabStop = false;
        gb.Text = i;
        gb.BackColor = Color.Silver;


        // 
        // cb1
        // 
        cb1.AutoSize = true;
        cb1.CheckAlign = System.Drawing.ContentAlignment.BottomCenter;
        cb1.Location = new System.Drawing.Point(15, 13);
        cb1.Margin = new System.Windows.Forms.Padding(0);
        cb1.Name = "cb1";
        cb1.Size = new System.Drawing.Size(17, 31);
        cb1.TabIndex = 0;
        cb1.Text = "1";
        cb1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
        cb1.UseVisualStyleBackColor = true;
        cb1.CheckedChanged += delegate (object sender, EventArgs e)
        {

            CheckBox b = new CheckBox();
            b = (CheckBox)sender;
            if (b.Checked == true)
            {
                gb.BackColor = Color.Turquoise;

            }
        };
        // 
        // cb2
        // 
        cb2.AutoSize = true;
        cb2.CheckAlign = System.Drawing.ContentAlignment.BottomCenter;
        cb2.Location = new System.Drawing.Point(35, 13);
        cb2.Name = "cb2";
        cb2.Size = new System.Drawing.Size(17, 31);
        cb2.TabIndex = 1;
        cb2.Text = "2";
        cb2.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
        cb2.UseVisualStyleBackColor = true;
        cb2.CheckedChanged += delegate (object sender, EventArgs e)
        {

            CheckBox b = new CheckBox();
            b = (CheckBox)sender;
            if (b.Checked == true)
            {
                gb.BackColor = Color.Turquoise;

            }
        };
        // 
        // cb3
        // 
        cb3.AutoSize = true;
        cb3.CheckAlign = System.Drawing.ContentAlignment.BottomCenter;
        cb3.Location = new System.Drawing.Point(58, 13);
        cb3.Name = "cb3";
        cb3.Size = new System.Drawing.Size(17, 31);
        cb3.TabIndex = 2;
        cb3.Text = "3";
        cb3.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
        cb3.UseVisualStyleBackColor = true;
        cb3.CheckedChanged += delegate (object sender, EventArgs e)
        {

            CheckBox b = new CheckBox();
            b = (CheckBox)sender;
            if (b.Checked == true)
            {
                gb.BackColor = Color.Turquoise;

            }

        };
        // 
        // cb4
        // 
        cb4.AutoSize = true;
        cb4.CheckAlign = System.Drawing.ContentAlignment.BottomCenter;
        cb4.Location = new System.Drawing.Point(81, 13);
        cb4.Name = "cb4";
        cb4.Size = new System.Drawing.Size(17, 31);
        cb4.TabIndex = 3;
        cb4.Text = "4";
        cb4.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
        cb4.UseVisualStyleBackColor = true;
        cb4.CheckedChanged += delegate (object sender, EventArgs e)
        {

            CheckBox b = new CheckBox();
            b = (CheckBox)sender;
            if (b.Checked == true)
            {
                gb.BackColor = Color.Turquoise;

            }
        };
        return gb;
    }
这是FormLoad的代码

       private void FrmThi_Load(object sender, EventArgs e)
    {
        droptable();
        this.CauDaLam = 0;
        if (dethi == null) setdethi();
        Screen scr = Screen.PrimaryScreen; //đi lấy màn hình chính
        this.Left = (scr.WorkingArea.Width - this.Width) / 2;
        this.Top = (scr.WorkingArea.Height - this.Height) / 2;
        int i = 0;
        foreach (DataRow row in this.dethi.Rows)
        {
            String myValue = row["SoDA"].ToString();
            String msch = row["MaCH"].ToString();
            ptl = new FrmPhieuTraLoi();
            pn_DeThi.Controls.Add(ptl.gbx("cau" + (i + 1).ToString(), int.Parse(myValue), (i + 1).ToString(), msch));
            listptl.Add(ptl);
            i++;
        }
        loadcauhoi(this.CauDangLam);
        listptl[CauDangLam].setBackColorCDL();

        Random r = new Random();
        lbmade1.Text = r.Next(1, 4).ToString();
        txt = lbSatHachBangLai.Text;
        len = txt.Length;
        lbSatHachBangLai.Text = "";
        timer1.Start();
        this.timer2.Start();

    }

我将扩展GroupBox控件并为问题ID添加属性(添加新项>自定义控件),并将类更改为如下所示:

    public partial class QuestionGroupBox : GroupBox
    {
        public string QuestionID;

        public QuestionGroupBox()
        {
            InitializeComponent();
        }

        protected override void OnPaint(PaintEventArgs pe)
        {
            base.OnPaint(pe);
        }
    }
然后填充flowlayout并设置QuestionID,然后单击EventHandler,如下所示:

 var gb = new QuestionGroupBox{  QuestionID = "44"};
 gb.Click += new System.EventHandler(this.questionGroupBox_Click);
 //add add to your flow layout
最后创建事件处理程序以获取并显示问题

private void questionGroupBox_Click(object sender, EventArgs e)
{
   var questionID = ((QuestionGroupBox)sender).QuestionID;
   //display your question
}

我将扩展GroupBox控件并为问题ID添加属性(添加新项>自定义控件),并将类更改为如下所示:

    public partial class QuestionGroupBox : GroupBox
    {
        public string QuestionID;

        public QuestionGroupBox()
        {
            InitializeComponent();
        }

        protected override void OnPaint(PaintEventArgs pe)
        {
            base.OnPaint(pe);
        }
    }
然后填充flowlayout并设置QuestionID,然后单击EventHandler,如下所示:

 var gb = new QuestionGroupBox{  QuestionID = "44"};
 gb.Click += new System.EventHandler(this.questionGroupBox_Click);
 //add add to your flow layout
最后创建事件处理程序以获取并显示问题

private void questionGroupBox_Click(object sender, EventArgs e)
{
   var questionID = ((QuestionGroupBox)sender).QuestionID;
   //display your question
}

这是一个示例代码:

private void Form1_Load(object sender, EventArgs e)
{
    for(int idx = 0; idx < 5; idx++)
    {
        var gBox = new GroupBox();
        gBox.Height = 50;
        gBox.Width = 50;
        gBox.Text = "Box: " + idx;
        gBox.Tag = idx;

        gBox.MouseClick += GBox_MouseClick;

        this.Controls.Add(gBox);
    }
}

private void GBox_MouseClick(object sender, MouseEventArgs e)
{
    //var ctrl = sender as Control; -- Not required
    int questionIdx = (int)(sender as Control).Tag;            
}
private void Form1\u加载(对象发送方,事件参数e)
{
for(intidx=0;idx<5;idx++)
{
var gBox=newgroupbox();
gBox.高度=50;
gBox.宽度=50;
gBox.Text=“Box:+idx;
gBox.Tag=idx;
gBox.MouseClick+=gBox\u MouseClick;
this.Controls.Add(gBox);
}
}
private void GBox_鼠标单击(对象发送器,鼠标目标e)
{
//var ctrl=发送方作为控件;--不需要
int questionIdx=(int)(发送者作为控件).Tag;
}

这是一个示例代码:

private void Form1_Load(object sender, EventArgs e)
{
    for(int idx = 0; idx < 5; idx++)
    {
        var gBox = new GroupBox();
        gBox.Height = 50;
        gBox.Width = 50;
        gBox.Text = "Box: " + idx;
        gBox.Tag = idx;

        gBox.MouseClick += GBox_MouseClick;

        this.Controls.Add(gBox);
    }
}

private void GBox_MouseClick(object sender, MouseEventArgs e)
{
    //var ctrl = sender as Control; -- Not required
    int questionIdx = (int)(sender as Control).Tag;            
}
private void Form1\u加载(对象发送方,事件参数e)
{
for(intidx=0;idx<5;idx++)
{
var gBox=newgroupbox();
gBox.高度=50;
gBox.宽度=50;
gBox.Text=“Box:+idx;
gBox.Tag=idx;
gBox.MouseClick+=gBox\u MouseClick;
this.Controls.Add(gBox);
}
}
private void GBox_鼠标单击(对象发送器,鼠标目标e)
{
//var ctrl=发送方作为控件;--不需要
int questionIdx=(int)(发送者作为控件).Tag;
}

因为这是winforms-假设您有一个包含问题列表的数据结构。假设数据结构已被索引。为GrpBox click事件创建一个事件处理程序,当您动态创建groupbox时,将事件分配给它。还将groupBox的Tag属性设置为问题的索引。通过这种方式单击事件触发-使用(发送者为GroupBox)。Tag=>您可以找到问题,您可以提供更多详细信息吗?如何为GrpBox click事件创建事件处理程序因为这是winforms-假设您有一个包含问题列表的数据结构。假设数据结构已被索引。为GrpBox click事件创建一个事件处理程序,当您动态创建groupbox时,将事件分配给它。还将groupBox的Tag属性设置为问题的索引。通过这种方式单击事件触发-使用(发送者为GroupBox)。Tag=>您可以找到问题,您可以提供更多详细信息吗?如何为GrpBox click Event创建事件处理程序您可以做同样的事情,而无需扩展GroupBox,并按照Prateek的建议使用Tag属性(这有点像黑客,但更容易),这更易于维护、扩展、安全且更易于理解。我遵循了您的指示。但是我遇到了这个错误,对象引用没有设置为对象的实例,这里是我的代码:
private void Gbox\u MouseClick(Object sender,MouseEventArgs e){var ctrl=sender as Control;int questionID=(int)(sender as Control).Tag;loadcauhoi(this.CauDangLam);}
和在FormLoad中:
ptl.getGroupBox().MouseClick+=Gbox\u MouseClick抱歉-这是不够的信息,您必须调试并解决它。您可以在不扩展GroupBox的情况下做同样的事情,并按照Prateek的建议使用Tag属性(这有点像黑客,但更容易),这更易于维护、可扩展、安全且易于理解。我遵循了您的指示。但是我遇到了这个错误,对象引用没有设置为对象的实例,这里是我的代码:
private void Gbox\u MouseClick(Object sender,MouseEventArgs e){var ctrl=sender as Control;int questionID=(int)(sender as Control).Tag;loadcauhoi(this.CauDangLam);}
和在FormLoad中:
ptl.getGroupBox().MouseClick+=Gbox\u MouseClick对不起-这是不够的信息,你将不得不调试和解决它。我按照你的指示。但是我遇到了这个错误,对象引用没有设置为对象的实例,这里是我的代码:
private void Gbox\u MouseClick(Object sender,MouseEventArgs e){var ctrl=sender as Control;int questionID=(int)(sender as Control).Tag;loadcauhoi(this.CauDangLam);}
和在FormLoad中:
ptl.getGroupBox().MouseClick+=Gbox\u MouseClick@PhucCoi-在loadcauhoi()方法调用中是否出现异常。检查一下,我是按照你的指示做的。但是我遇到了这个错误,对象引用没有设置为对象的实例,这里是我的代码:
private void Gbox\u MouseClick(Object sender,MouseEventArgs e){var ctrl=sender as Control;int questionID=(int)(sender as Control).Tag;loadcauhoi(this.CauDangLam);}
和在FormLoad中:
ptl.getGroupBox().MouseClick+=Gbox\u MouseClick@PhucCoi-在loadcauhoi()方法调用中是否出现异常。检查这个,卡当拉姆