2014-02-13 27 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) 

感謝您的幫助。

相關問題