2016-08-24 14 views
0

別のオブジェクトのMouseHoverイベントからボタンの可視性を呼び出そうとしています。 私がやっているのは、ピクチャボックスにマウスを置いて、そのピクチャボックスに接続されているボタンを表示するように設定したときです。デフォルトでは、作成時のボタンは表示されません。 MouseHoverイベントから呼び出すと、ボタンがnullと表示されます。私は相続財産に恵まれていないので、私はちょっとここにこだわっています。どんな助けもありがたいです。イベントの送信者が絵ではなく、ボタンなのでC#の別のクラスから呼び出してオブジェクトを継承する方法

private void Button1_Click(object sender, EventArgs e) 
{ 
    FlowLayoutPanel flP = new FlowLayoutPanel(); 
    PictureBox picB = new PictureBox(); 
    Label laB = new Label(); 
    Button btn = new Button(); 
    picB.Size = new Size(130, 70); 
    laB.Size = new Size(130, 20); 
    flP.Size = new Size(130, 90); 
    btn.Size = new Size(20, 20); 
    laB.Text = "Text"; 
    laB.Name = "Name"; 
    flP.Name = "Name"; 
    btn.Text = "X"; 
    btn.Name = "Name"; 
    btn.Visible = false; 
    flP.Controls.Add(picB); 
    flP.Controls.Add(laB); 
    picB.Controls.Add(btn); 
    flP.Location = new System.Drawing.Point(3, 3); 
    laB.Location = new System.Drawing.Point(3, 70); 
    btn.Location = new System.Drawing.Point(100, 5); 
    mainFLP.Controls.Add(flP); 
    picB.MouseHover += picB_MouseHover; 
    picB.DoubleClick += picB_DoubleClick; 
} 

private void picB_MouseHover(object sender, EventArgs e) 
{ 
    PictureBox pb = (PictureBox)sender; 
    Button bt = pb.Parent as Button; 
    //bt.Visible = true; 
} 

private void Form1_Load(object sender, EventArgs e) 
{ 
    for (int i = 1; i <= 10; i++) 
    { 
     FlowLayoutPanel flP = new FlowLayoutPanel(); 
     PictureBox picB = new PictureBox(); 
     Label laB = new Label(); 
     Button btn = new Button(); 
     picB.Size = new Size(130, 70); 
     laB.Size = new Size(130, 20); 
     flP.Size = new Size(130, 90); 
     btn.Size = new Size(20, 20); 
     flP.Name = i.ToString(); 
     laB.Name = "Link"; 
     laB.Text = "Name"; 
     btn.Text = "X"; 
     btn.Name = "b" + i.ToString(); 
     btn.Visible = false; 
     flP.Controls.Add(picB); 
     flP.Controls.Add(laB); 
     picB.Controls.Add(btn); 
     flP.Location = new System.Drawing.Point(3, 3); 
     laB.Location = new System.Drawing.Point(3, 70); 
     btn.Location = new System.Drawing.Point(100, 5); 
     mainFLP.Controls.Add(flP); 
     picB.MouseHover += picB_MouseHover; 
     picB.DoubleClick += picB_DoubleClick; 
    } 
} 

private void picB_DoubleClick(object sender, EventArgs e) 
{ 
    PictureBox pb = (PictureBox)sender; 
    FlowLayoutPanel flp = pb.Parent as FlowLayoutPanel; 
    flp.Dispose(); 
} 
+0

このシナリオでは継承が何の役割も果たさないことをご確認ください。 –

+0

[OK]ボタンをグローバルにすることなく表示させる方法が必要です。 – Toody

+0

ボタンbt =(ボタン)pb.Controls [0]; –

答えて

0

一つの方法のようなコマンドを使用してボタンを取得することができるように

PictureBox picB = new PictureBox(); 
Label laB = new Label(); 
Button btn = new Button(); 
btnDict.Add(picB,btn); 

あなたのピクチャボックスのプロパティ:

PictureBox picB = new PictureBox(); 
Button btn = new Button(); 
picB.Tag = btn; 

以降、あなたのMouseHover Hanlderで

+0

私は、ボタンを何とか直接呼び出すことはできないのですか? – Toody

0

それがnull: はここに(私が何をしようとしているだけMouseHoverイベントである)のコードです。 あなたは、単にクラスレベル

private Button btn; 
private void Button1_Click(object sender, EventArgs e) 
{ 
    FlowLayoutPanel flP = new FlowLayoutPanel(); 
    PictureBox picB = new PictureBox(); 
    Label laB = new Label(); 
    btn = new Button(); 

でボタンを宣言して、直接それが見え

private void picB_MouseHover(object sender, EventArgs e) 
{ 
    bt.Visible = true; 
} 

編集

それともあなたがたのPictureBoxを関連付けるために辞書を定義することができますすることができます対応するボタン

private var btnDict = new Dictionary<PictureBox,Button>(); 

とあなたがそれらを作成するとき、あなたはまた、それらをリンクすることができ、あなたがタグ内のボタンの変数を格納することができ

PictureBox pb = (PictureBox)sender; 
var btn = btnDict[pb]; 
+0

返信いただきありがとうございますが、そのクラスにローカルなDoubleClickイベントのFlowLayoutPanelで行ったようにアクセスしようとしています。 – Toody

+0

また、見つかったFlowLayoutPanelを対応するボタンに関連付けるディクショナリを定義することもできます。 –

+0

ボタンはPictureBox内にあり、PictureBoxはFlowLayoutPanelの内側にあります。その辞書について、私はあなたが何を言おうとしているのか分かりません。 – Toody

関連する問題