2016-08-24 9 views
0

Я пытаюсь вызвать видимость кнопки из события MouseHover на другом объекте. То, что я пытаюсь сделать, - это когда я нажимаю над PictureBox, чтобы установить кнопку, прикрепленную к этому изображению, чтобы быть видимым, по умолчанию кнопка, когда она создана, невидима. Когда я пытаюсь вызвать его из события MouseHover, он говорит, что кнопка имеет значение NULL. Я не так хорош с наследованием, поэтому я немного застрял здесь, любая помощь будет оценена. Вот код (то, что я пытаюсь сделать, это только на 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

Кнопка bt = (кнопка) pb.Controls [0]; –

ответ

0

Один метод может быть для хранения переменной Button в теге свойство вашей картины коробки:

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

Это нуль, так как отправитель случае картина, а не кнопка. Вы можете просто объявить кнопку на уровне класса

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 picB = new PictureBox(); 
Label laB = new Label(); 
Button btn = new Button(); 
btnDict.Add(picB,btn); 

, так что вы можете получить кнопку с командой, как

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

Спасибо за ваш ответ, но я пытаюсь получить к нему доступ, как я сделал с FlowLayoutPanel в событии DoubleClick, который является локальным в этом классе. – Toody

+0

Или вы можете определить словарь, чтобы связать найденную FlowLayoutPanel с соответствующей кнопкой –

+0

. Кнопка находится внутри PictureBox, PictureBox находится внутри FlowLayoutPanel. Об этом словаре я не знаю, что вы пытаетесь сказать. – Toody