3

かなりの数の動的要素を含む WinForm を構築していますが、ネストされたコントロール内の親子関係に問題があると思います。私が見つけた既存の質問はすべて WebForms に限定されているようで、まったく役に立ちませんでした。

カスタムメイドのコントロールにも問題がありましたが、それは関連する問題かもしれません。

それぞれに多数の NUD が関連付けられた多数の PictureBox を表示しようとしています。最初は手作業で多くのコントロールを作成してこれを行いましたが、今ではプロセスを自動化し、コードを別の場所で再利用したいと考えています。

実際のコードはこれよりも少し複雑ですが、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 があります。それらの子パネルの 1 つは、私が現在取り組んでいる領域です。(上記の panel_book と呼ばれます) そのパネルは、PictureBox とその友達を含む子パネルを動的に追加するものです。

厄介なのは、これらの MouseEnter および Click イベントがトリガーされないことです。まったく。以前、コントロールが動的ではなかったときに実行時にイベント ハンドラーを追加しましたが、これほど多くの問題はありませんでした。ネストされたコントロールでもこれを行ったと確信しています。

最後に、最後の子パネルを独自のカスタム コントロールにすることを検討しましたが、同様の問題がありました。おそらく、この問題の修正を見つけることでそれも修正されると思いますが、修正されないことがわかっている場合は、正しい方向に向けていただけますか?

ありがとう、 :)

4

2 に答える 2

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、メッセージ ボックスが表示されます。ここから始めて、これを実際のコードのように見せ始めると、最終的に問題が発生します。

問題が何であれ、投稿したコードだけではなく、他のコード/デザイナー要素との相互作用にあります。

于 2010-03-05T02:44:37.203 に答える
0

そう...

面白いこと。どうやら、これらの親コントロールの 1 つが無効になっていました。ファンシー。

別のコントロール セットで機能の約半分を再作成し、機能するようにしました。その時までに、問題はロジックではなく、コントロールの 1 つに関連している必要があることに気付きました。

そのコントロールがいつ、どのように、またはなぜ無効になったのかはわかりませんが、それは確かに私の「チェックすべき愚かなこと」リストの一番上にあります. >_<

于 2010-03-06T02:31:29.353 に答える