2016-08-24 26 views
0

我想從另一個對象上的MouseHover事件調用按鈕的可見性。 我想要做的是當我把鼠標放在一個圖片框上,將附加到該圖片框的按鈕設置爲可見時,默認情況下該按鈕被創建時是不可見的。 當我嘗試從MouseHover事件調用它時,它說該按鈕爲空。我不擅長繼承,所以我有點卡在這裏,任何幫助,將不勝感激。 下面是代碼(我想要做的是隻在MouseHover事件):如何使用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

好吧,但必須有一種方法可以在不使按鈕成爲全局的情況下使其可見。 – Toody

+0

Button bt =(Button)pb.Controls [0]; –

回答

0

一種方法可以存儲在標籤上的按鈕變量您的圖片框的屬性:

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

後來,在MouseHover Hanlder

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

我明白了,所以我不能直接調用按鈕? – Toody

0

它爲null,因爲該事件的發送者是圖片,而不是按鈕。 你可以簡單地在類級別

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; 
} 

編輯

或者你可以定義一個字典查找到的圖片框與關聯相應的按鈕

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

,當你創建它們,你也可以將它們鏈接,

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

,這樣你可以用一個命令檢索按鈕像

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

感謝您的回覆,但我試圖訪問它,就像我在該類中的本地DoubleClick事件中使用FlowLayoutPanel一樣。 – Toody

+0

或者您可以定義一個字典,將找到的FlowLayoutPanel與相應的按鈕相關聯。 – 2016-08-24 08:16:12

+0

該按鈕位於PictureBox內,PictureBox位於FlowLayoutPanel內。關於那本詞典我不知道你在說什麼。 – Toody

相關問題