2014-02-13 19 views
0

我创建了一个UserControl,它上面有一个FlowLayoutPanel。我在运行时使用PictureBoxes的CollectionBase填充此面板。然后我的WindowsForm上有一个FlowLayoutPanel,我使用我的UserControls的CollectionBase在运行时填充。如何访问存储在System.Collections.CollectionBase中的UserControl中的方法?

现在,我希望能够访问我的UserControl中的自定义函数,以便将另一个PictureBox添加到实例化(现有)UserControl的FlowLayoutPanel中。我如何访问该功能来做到这一点?

该函数在UserControl中是公共的,但我无法通过CollectionBase来使用它。

这里是我的用户控件代码:

public partial class UserDisplay : UserControl 
{ 
    public UserDisplay() 
    { 
     InitializeComponent(); 
     myEquipArray = new ImageArray(flpnlTools); 
    } 
    public void AddEquip(string EquipName, Image EquipImage) 
    { 
     myEquipArray.AddNewEquip(EquipName, EquipImage); 
    } 
    //Accessor 
    public ControlCollection Equips 
    { 
     get 
     { 
      return flpnlEquips.Controls; 
     } 
    } 
} 
public class ImageArray : System.Collections.CollectionBase 
{ 
    private readonly System.Windows.Forms.FlowLayoutPanel HostPanel; 

    public ImageArray(FlowLayoutPanel hostPanel) 
    { 
     HostPanel = hostPanel; 
    } 

    public System.Windows.Forms.PictureBox AddNewEquip(string EquipName, Image EquipImage) 
    { 
     PictureBox pbA = new PictureBox(); 
     this.List.Add(pbA); 
     HostPanel.Controls.Add(pbA); 
     pbA.Tag = EquipName; 
     pbA.Image = EquipImage; 

     return pbA; 
    } 

    public void RemoveEquip(string EquipName) 
    { 
     if (this.Count > 0) 
     { 
      int i = 0; 
      while (EquipName != HostPanel.Controls[i].Tag.ToString()) 
      { 
       i++; 
      } 
      HostPanel.Controls.Remove(this[EquipName]); 
      this.List.RemoveAt(i); 
     } 
    } 

    public PictureBox this[string EquipName] 
    { 
     get 
     { 
      int i = 0; 
      while (EquipName != HostPanel.Controls[i].Tag.ToString()) 
      { 
       i++; 
      } 
      return (PictureBox)this.List[i]; 
     } 
    } 
} 

我用这个类来实现我的WindowsForm的UserConrol:

public class UserDsp : System.Collections.CollectionBase 
    { 
     private readonly System.Windows.Forms.FlowLayoutPanel HostPanel; 

     public DisplayControl.UserDisplay AddNewUser(Int64 UserID, string UserName, Image UserImage, string EquipName, Image EquipImage) 
     { 
      DisplayControl.UserDisplay newUser = new DisplayControl.UserDisplay(); 
      this.List.Add(newUser); 
      HostPanel.Controls.Add(newUser); 
      newUser.Tag = UserID; 
      newUser.UserName = UserName; 
      newUser.UserImage = UserImage; 
      newUser.AddEquip(EquipName, EquipImage); //THIS ADDS THE PICTUREBOX CORRECTLY 

      return newUser; 
     } 

     public void AddNewEquip(Int64 UserID, Int64 EquipID, string EquipName, Image EquipImage) 
     { 
      if (this.Count > 0) 
      { 
       int i = 0; 
       while (UserID != Convert.ToInt64(HostPanel.Controls[i].Tag)) 
       { 
        i++; 
       } 
       // Found the Control with UserID 
       HostPanel.Controls[i].AddEquip(EquipName, EquipImage); //THIS DOES NOT WORK 
      } 
     } 

     public UserDsp(System.Windows.Forms.FlowLayoutPanel hostPanel) 
     { 
      HostPanel = hostPanel; 
     } 

     public void RemoveUser(Int64 UserID) 
     { 
      if (this.Count > 0) 
      { 
       int i = 0; 
       while (UserID != Convert.ToInt64(HostPanel.Controls[i].Tag)) 
       { 
        i++; 
       } 
       HostPanel.Controls.Remove(this[UserID]); 
       this.List.RemoveAt(i); 
      } 
      UsersLogdIn.Remove(UserID); 
     } 

     public DisplayControl.UserDisplay this[Int64 UserID] 
     { 
      get 
      { 
       int i = 0; 
       while (UserID != Convert.ToInt64(HostPanel.Controls[i].Tag)) 
       { 
        i++; 
       } 
       return (DisplayControl.UserDisplay)this.List[i]; 
      } 
     } 

     public List<long> usersLogdIn 
     { 
      get 
      { 
       return UsersLogdIn; 
      } 
     } 
    } 
} 

在这段代码中,我可以创建控件的一个新的PictureBox FlowLayoutPanel实例化控件时:

  newUser.AddEquip(EquipName, EquipImage); //THIS ADDS THE PICTUREBOX CORRECTLY 

但是当我尝试ac塞斯它通过CollectionBase的:

 public void AddNewEquip(Int64 UserID, Int64 EquipID, string EquipName, Image EquipImage) 
     { 
      if (this.Count > 0) 
      { 
       int i = 0; 
       while (UserID != Convert.ToInt64(HostPanel.Controls[i].Tag)) 
       { 
        i++; 
       } 
       // Found the Control with UserID 
       HostPanel.Controls[i].AddEquip(EquipName, EquipImage); //THIS DOES NOT WORK 
      } 
     } 

我也试图拉控制输出是这样的:

 public void AddNewEquip(Int64 UserID, Int64 EquipID, string EquipName, Image EquipImage) 
     { 
      if (this.Count > 0) 
      { 
       int i = 0; 
       while (UserID != Convert.ToInt64(HostPanel.Controls[i].Tag)) 
       { 
        i++; 
       } 
       // Found the Control with UserID 
       UserDisplay newUserDisplay = HostPanel.Controls[i] as UserDisplay //THIS DOES NOT WORK 
      } 
     } 

我已经到处找关于这个帮助,但还没有找到任何有关。请帮忙!

谢谢。

+0

当调试断点到达'HostPanel.Controls [i] .AddEquip(EquipName,EquipImage);时,请告诉我'Count'和'i'的值。 //这是行不通的' –

+0

你是否在添加代码之后像下面这样拉出控件:'newUserDisplay.AddEquip(EquipName,EquipImage);' –

+0

我之后添加了代码。我不知道为什么它不起作用。 – kanderson

回答

0

我想出了一些外界的帮助。

基本上我需要将控件作为UserDisplay进行类型转换。我不知道为什么它不工作时,我拉出来使用:

UserDisplay newUserDisplay = HostPanel.Controls[i] as UserDisplay 

,但我用这个代码,而不是:

(HostPanel.Controls[i] as UserDisplay).AddEquip(EquipName, EquipImage); 

我并确保控制是正确的类型之前,我宣布它使这样:

if (HostPanel.Controls[i] is UserDisplay) 

感谢您的帮助。

相关问题