gpt4 book ai didi

c# - 嵌套动态控件,使用自定义事件处理程序

转载 作者:行者123 更新时间:2023-11-30 17:23:04 33 4
gpt4 key购买 nike

我正在构建一个包含大量动态元素的 WinForm,我认为我在处理嵌套控件中的父/子关系时遇到了一些问题。我能找到的所有现有问题似乎都是 WebForms 独有的,并不是完全有用。

我在使用定制控件时也遇到了一些麻烦,但这可能是一个相关问题。

我正在尝试显示许多 PictureBoxes,每个 PictureBoxes 都有许多关联的 NUD。我最初是通过手动制作大量控件来做到这一点的,但现在我想自动化该过程并在其他地方重复使用代码。

实际代码比这复杂一点,但这里是伪代码和实际代码混合的重要部分

panel_book.Controls.Clear();

for (loop controls)
{

//INITIALIZE CHILD CONTROLS
PictureBox tempBox = new PictureBox();
NumericUpDown t1 = new NumericUpDown();
NumericUpDown t2 = new NumericUpDown();
NumericUpDown t3 = new NumericUpDown();
NumericUpDown t4 = new NumericUpDown();

tempBox.Image = getImage();
tempBox.Size = tempBox.Image.Size;
tempBox.Tag = getValue();



//THIS IS WHAT IS GIVING ME TROUBLE
//=======================================================
tempBox.MouseEnter += new EventHandler(Binder_MouseEnter);
tempBox.Click += new EventHandler(smallCardNew_Click);



//THINGS I'VE TRIED
tempBox.BringToFront();
tempBox.Focus();


t1.Size = new Size();
t2.Size = t1.Size; t3.Size = t1.Size; t4.Size = t1.Size;
t1.Location = new Point();
t2.Location = new Point(); t3.Location = new Point(); t4.Location = new Point();
t1.Value = 0;
t2.Value = 0; t3.Value = 0; t4.Value = 0;
t1.Enabled = true; t2.Enabled = true;
t3.Visible = false; t4.Visible = false;


//CREATE THE NEW PARENT CONTROL (PANEL)
Panel tempPanel = new Panel();
tempPanel.Margin = new Padding(0, 0, 0, 0);
tempPanel.Controls.Add(tempBox);
tempPanel.Controls.Add(t1);
tempPanel.Controls.Add(t2);
tempPanel.Controls.Add(t3);
tempPanel.Controls.Add(t4);

tempPanel.Size = new Size();
tempPanel.Location = new Point();

panel_book.Controls.Add(tempPanel);


}//end loop


///

void smallCardNew_Click(object sender, EventArgs e)
{
MessageBox.Show("Click Event Triggered");
}
void Binder_MouseEnter(object sender, EventArgs e)
{
MessageBox.Show("Mouse Enter Event Triggered");
}

希望这很清楚,以防万一它很重要,这里有更多背景信息。

我有一个非常大的 FlowLayoutPanel,其中包含一些子面板。这些子面板之一是我现在正在处理的区域。 (上面称为 panel_book)那个 面板是我动态添加带有 PictureBox 和 friend 的子面板的地方。

烦人的是,那些 MouseEnter 和 Click 事件没有被触发。完全没有。我以前在运行时添加过事件处理程序,当时控件 不是动态的,而且从来没有遇到过这么多麻烦。我很确定我什至也使用嵌套控件做到了这一点。

最后,我考虑过将最后一个子面板放入其自己的自定义控件中,但遇到了类似的问题。想必找到解决此问题的方法也会解决这个问题,但如果您知道不会,能否请您指出正确的方向?

谢谢,:)

最佳答案

除了“我尝试过的事情”列表在控件实际具有句柄(即添加到父项并且所有祖先也有父项,去直到表单级别);但是,您需要有条不紊地解决这个问题,从最小的可重现案例开始,而不是从一大堆代码开始。

以下代码确实有效(为了测试,只需在 Windows 窗体上放置一个按钮和流程面板):

private void button1_Click(object sender, EventArgs e)
{
PictureBox pb = new PictureBox();
pb.Location = new Point(0, 0);
pb.Size = new Size(300, 300);
pb.Image = SomeImage;
pb.Click += new EventHandler(PictureBoxClick);

Panel panel = new Panel();
panel.Location = new Point(10, 40);
panel.Size = new Size(300, 300);
panel.Controls.Add(pb);

flowLayoutPanel1.Controls.Add(panel);
}

private void PictureBoxClick(object sender, EventArgs e)
{
MessageBox.Show("Picture box clicked");
}

如果我执行此代码并单击 PictureBox,就会显示消息框。从这里开始,开始让代码看起来更像您的真实代码,最终您会发现问题所在。

无论问题是什么,它不仅存在于您发布的代码中,还存在于与其他代码/设计器元素的交互中。

关于c# - 嵌套动态控件,使用自定义事件处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2384117/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com