C# 如何在C中使用DynamicGroupBox中的Click事件#
我有一张这样的表格。您可以在右侧的Flowlayout中看到我的动态groupbox(30 groupbox),在左侧可以看到一个显示问题的图片框。 我在琢磨如何在Picturebox中为每个groupbox使用Click事件来显示等价的问题 这是我的groupbox代码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);
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()方法调用中是否出现异常。检查这个,卡当拉姆