2012-07-30 114 views
1
if(pictureBox1.Tag.ToString() == "accept") 
     { 
      char room1 = Convert.ToChar(lbl_roomid1.Text); 
      row1[13] = (byte)room1; 

      DateTime sdt1 = DateTime.Parse(txt_sdate1.Text); 
      //some code 
     } 
    if (pictureBox2.Tag.ToString() == "accept") 
     { 
      char room2 = Convert.ToChar(lbl_roomid2.Text); 
      row1[13] = (byte)room2; 

      DateTime sdt1 = DateTime.Parse(txt_sdate2.Text); 
      //some code 
     } 

/*如果我想在循环内键入此代码怎么办?我需要为10个pictureboxes */如何使用循环访问C#中的表单元素?

+0

尝试使用for循环如果可能的话。因为foreach适用于实现IEnumerable接口的对象集合。您不能使用foreach从源集合中添加或删除项目以避免不可预知的副作用。如果您需要添加或删除源集合中的项目,请使用for循环。 – Narendra 2012-07-30 07:25:18

+0

@Shee跟进:如果你有你想要的答案,不要忘记标记为正确。问候。 – 2012-07-31 01:24:59

回答

4

像这样做同样的:

public void DoMagic(Label label, TextBox textBox) 
    { 
     //... 
    } 

而且这样的:

 foreach (Control currentControl in this.Controls) 
     { 
      if (currentControl is PictureBox) 
      { 
       if (((PictureBox)currentControl).Tag.ToString().Equals("accept")) 
       { 
        string controlId = currentControl.Name.Remove(0, 11); 
        string labelName = string.Concat("lbl_roomid", controlId); 
        string txtName = string.Concat("txt_sdate", controlId); 

        this.DoMagic(this.Controls.Find(labelName, true)[0] as Label, this.Controls.Find(txtName, true)[0] as TextBox); 
       } 
      } 
     } 

问候

+0

请注意,OP的循环也为每种情况分别标记和文本框。 – AKX 2012-07-30 07:20:00

+0

@AKX我正在努力 – 2012-07-30 07:21:09

2

你可以做的元素的数组。

以下是有点脏,但是......

class PBRoomDate { 
    // Helper data holder class. Could probably be an anonymous class in C# 4.0 
    public PictureBox PB; 
    public Label RoomLabel; 
    public TextBox DateText; 
    PBRoomDate(PictureBox PB, Label RoomLabel, TextBox DateText) { 
    this.PB = PB; this.RoomLabel = RoomLabel; this.DateText = DateText; 
    } 
} 

// [...] 

var pbRoomDates = new PBRoomDate[]{ 
    new PBRoomDate(pictureBox1, lbl_roomid1, txt_sdate1), 
    new PBRoomDate(pictureBox2, lbl_roomid2, txt_sdate2), 
    new PBRoomDate(pictureBox3, lbl_roomid3, txt_sdate3), 
    // etc. 
}; 

foreach(var pbRoomDate in pbRoomDates) { 
    if(pbRoomDate.PB.Tag.ToString() == "accept") { 
    row1[13] = (byte)Convert.ToChar(pbRoomDate.RoomLabel.Text); 
    DateTime dt = DateTime.Parse(pbRoomDate.DateText.Text); 
    } 
} 

的清洁的解决方案是使用自定义的用户控件包含每个“图片框”三个要素打下了那些。如果需要的话,这也会更易于维护和扩展。

0

循环访问c#中的表单元素。

我通常使用类似这样的东西。

让我说我有10个图片盒我把它命名为picturebox1 - picturebox10。

然后 做数的循环来10我用一个变量没有 里面把这个代码

String Picturebox = "picturebox" + no.ToString(); 
Control[] oControl = Controls.Find(Picturebox, true); 
foreach(Control foundControl in oControl) 
{ 
    PictureBox foundControlA = foundControl as PictureBox; 
    foundControlA.(methods or property here) = (what you want to put to foundControlA) 

} 

如果你有伴随着你可以用同样的方法各控制更多的控制。这里的提示是我在我的winforms中对我的元素或对象使用了相同的命名约定,并根据需要循环变量no。

相关问题