2013-04-01 2 views
1

Я создаю некоторые PictureBox динамически и PictureBox нажмите событие следующимПолучить индекс массива PictureBox щелкнул

Image myImage = Image.FromFile("image/Untitled6.png"); 
PictureBox[] txtTeamNames = new PictureBox[5];   

for (int i = 0; i < txtTeamNames.Length; i++) 
{ 
    var txt = new PictureBox(); 
    txtTeamNames[i] = txt;     
    txtTeamNames[i].Image = myImage;     
    txtTeamNames[i].Height = 53; 
    txtTeamNames[i].Width = 48;     
    this.panel1.Controls.Add(txtTeamNames[i]);     
    txtTeamNames[i].Visible = true; 
    txtTeamNames[i].Click += new EventHandler(this.clcikeventhandle); 
} 

Когда кто-то нажимает на любой коробке изображения, как я нахожу его индекс массива и имя?

void clickEventHandler(object sender, EventArgs e) 
{   
    //??? 
} 

ответ

3

Вы можете получить доступ к PictureBox через sender аргумента. Так что попробуйте это:

PictureBox[] txtTeamNames; 

void YourMethod() 
{ 
    Image myImage = Image.FromFile("image/Untitled6.png"); 
    txtTeamNames = new PictureBox[5];   
    //The same as your code 
} 

void clcikeventhandle(object sender, EventArgs e) 
{   
    int index = txtTeamNames.IndexOf(sender As PictureBox); 
} 

EDIT: Подход # 2

Но если вы не согласны с объявляя, что массив в рамках класса вы можете попробовать этот подход:

//Same as your code 
for (int i = 0; i < txtTeamNames.Length; i++) 
{ 
    //Save as your code 
    txtTeamNames[i].Tag = i;      // ADD THIS LINE 
} 

Тогда :

void clcikeventhandle(object sender, EventArgs e) 
{    
    int index = int.Parse((sender As PictureBox).Tag.ToString()); 
} 
+0

+1. Теперь речь идет только о сфере. Если OP в порядке с объявлением 'txtTeamNames' на уровне класса, это ответ. – Neolisk

1

Другое предложение - создать пользовательский класс, который наследуется от PictureBox. Он будет иметь дополнительную недвижимость Index. И вы можете установить его между этими двумя линиями:

txtTeamNames[i].Visible = true; 
//assign the index here 
txtTeamNames[i].Click += new EventHandler(this.clcikeventhandle); 

так:

txtTeamNames[i].Index = i; 

Тогда в обработчике:

void clickEventHandle(object sender, EventArgs e) 
{ 
    PictureBox pbox = sender As PictureBox; 
    int index = pbox.Index(); 
    string name = pbox.Name(); 
} 

Вы сохраняете тот же объем переменных, которые могут быть полезно, если вас это беспокоит. Если вы в порядке с областью обновления txtTeamNames до уровня класса, см. another answer by Hossein Narimani Rad.

+0

Мне интересно узнать, как вы создаете ссылку именно для моего ответа? Как это возможно? Благодарю. –

+0

@HosseinNarimaniRad: есть ссылка на ссылку ниже вашего ответа. :) – Neolisk

+0

Вау! Кажется, я этого никогда не замечал! –

0
namespace your_name_project 
{ 
    public partial class Form_Begin : Form 
    { 
     PictureBox[] pictureBoxs = new PictureBox[6]; 
     public Form_Begin() 
     { 
      InitializeComponent(); 
      pictureBoxs[0] = pictureBox1; pictureBoxs[1] = pictureBox2; pictureBoxs[2] = pictureBox3; 
      pictureBoxs[3] = pictureBox4; pictureBoxs[4] = pictureBox5; pictureBoxs[5] = pictureBox6;  
     } 
//continue 
     List<PictureBox> pictureBoxes = new List<PictureBox>(); 

      private void buttonX1_Click(object sender, EventArgs e) 
      { 
       for (int i = 0; i <3; i++) 
       { 
        pictureBoxs[i].Image =your_name_project.Properties.Resources.image_1;// load image1 and Image_2from resource in property of picturebox 
       } 
       for (int i = 3; i < 6; i++) 
       { 
        pictureBoxs[i].Image = your_name_project.Properties.Resources.Image_2; 
       } 
      } 
     } 
} 
Смежные вопросы