我創建了一個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
}
}
我已經到處找關於這個幫助,但還沒有找到任何有關。請幫忙!
謝謝。
當調試斷點到達'HostPanel.Controls [i] .AddEquip(EquipName,EquipImage);時,請告訴我'Count'和'i'的值。 //這是行不通的' –
你是否在添加代碼之後像下面這樣拉出控件:'newUserDisplay.AddEquip(EquipName,EquipImage);' –
我之後添加了代碼。我不知道爲什麼它不起作用。 – kanderson