我正在构建一个包含很多动态元素的WinForm,我认为我在嵌套控件中遇到了父/子关系的问题。 我能找到的所有现有问题似乎都是WebForms独有的,这并不完全有用。
我在定制控件方面遇到了一些问题,但这可能是一个相关的问题。
我正在尝试显示多个PictureBox,每个PictureBox都有许多相关的NUD。我最初通过手工制作大量控件来做到这一点,但现在我想自动化该过程并在其他地方重复使用代码。
实际代码比这复杂一点,但这里是PseudoCode和实际代码混合中的重要位
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&动态添加子面板的东西。朋友来。
令人讨厌的是,那些MouseEnter和Click事件没有被触发。完全没有。 我之前在运行时添加了事件处理程序,当控件不是动态的时候,从来没有遇到过这么多麻烦。我很确定我甚至也使用嵌套控件。
最后,我考虑将最后一个子面板放入自己的自定义控件中,但是遇到了类似的问题。大概找到解决这个问题的方法也会解决这个问题,但是如果你知道它不会,那么请指点我正确的方向吗?
谢谢, :)
答案 0 :(得分:2)
我没有看到任何明显错误的代码除了“我尝试过的东西”列表之外无效,直到控件实际上有一个句柄(即添加到父级,所有祖先也有父母,去达到表格水平);但是,你需要有条不紊地完成这个工作,从最小的可重复的案例开始,而不是大量的代码。
以下代码可以工作(要测试,只需在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
,我会显示消息框。从这里开始,开始使这个看起来更像你的真实代码,最终你会遇到问题。
无论问题是什么,它不只是在您发布的代码中,而是与其他代码/设计器元素的交互。
答案 1 :(得分:0)
因此...
有趣的是。显然,其中一个父控件被禁用。想象一下。我在一组不同的控件上重新创建了大约一半的功能并使其正常工作。到那时我意识到问题已经与其中一个控件相关,而不是逻辑。
我不知道该控件何时,如何或为什么被禁用,但这肯定会成为我''要检查的愚蠢事情'列表的顶部。 > _<