【问题标题】:Accessing certain instance of a Winform control访问某个 Winform 控件的实例
【发布时间】:2018-01-07 03:44:06
【问题描述】:

在我编写的这个程序中,我使用一个函数来创建一个 PictureBox 的多个实例。这是代码:

public void serverCard()
{
    //Definitions
    PictureBox cardBack = new PictureBox();

    //Specifics for card
    cardBack.Size = new Size(cardSizeX, cardSizeY);
    cardBack.BackColor = Color.White;
    cardBack.Left = startX;
    cardBack.Top = startY;

    serverArea.Controls.Add(cardBack);

    //differences in pos
    startX += cardBack.Width + 5;
    if (startX > this.Width - cardSizeX)
    {
      startY += cardBack.Height + 5;
      startX = 5;
    }
}

我将如何访问 PictureBox 的特定实例。 例如:我使用此函数创建了 5 个名为“cardBack”的图片框。我想改变创建的第二个图片框的位置,我该怎么做。

【问题讨论】:

    标签: c# winforms visual-studio picturebox visual-c#-express-2010


    【解决方案1】:

    1) 你可以给每个PictureBox 一个不同的名字(可能是"cardBack" + ID_in_int

    int picBox_ID = 1;
    public void serverCard()
    {
        PictureBox cardBack = new PictureBox();
        cardBack.Name = "cardBack" + picBox_ID;
        picBox_ID++;
    

    并按名称将它们从Controls 中拉出来:

    PictureBox temp = serverArea.Controls.OfType<PictureBox>().FirstOrDefault(x=>x.Name == "cardBack2");
    

    2) 或者您可以有一个单独的类型集合:List&lt;PictureBox&gt;,您可以在其中另外存储它们

    List<PictureBox> picCollection = new List<PictureBox>();
    public void serverCard()
    {
        PictureBox cardBack = new PictureBox();
        picCollection.Add(cardBack);
    

    并以您想要的方式访问它们。可能是您感兴趣的订单。

    3) 另一种可能性是创建一个新类,该类具有PictureBox 类型的属性和另一个属性int ID。您可以拥有一个包含这些对象的集合,并且每个对象都可以有一个唯一的 ID 和相应的PictureBox。您仍然可以将图片框放入Controls,并根据您的需要过滤收藏。

    【讨论】:

    • 当使用上面的第一种方法时,我得到“System.NullReferenceException: 'Object reference not set to an instance of an object.'”
    • @Jumbofile 在哪一行?当您尝试从 Controls 访问 picbox 时?我在名称字符串中有错字。我改变了它。你检查你的名字写对了吗?
    • 是的,我将名称更改为“cardBack2”,在尝试删除或更改图片框的可见性时弹出。
    • 你能从Controls 中取出正确的图片框吗?你是如何尝试删除图片框的
    • 我试过serverArea.Controls.Remove(temp);temp.Visible = false;
    【解决方案2】:

    创建一个返回PictureBox实例的方法

    public PictureBox CreatePictureBox ()
    {
      // your code from question here
    }
    

    然后在表单中定义一个字段

    private Dictionary<string, PictureBox> pboxes = new Dictionary<string, PictureBox>();
    

    任何时候你想创建一个新的PictureBox 把它放在pboxes 集合中:

    pboxes.Add("box1", CreatePictureBox());    
    

    现在您可以像这样访问您的盒子:

    pboxes["box1"].Width += 20;

    【讨论】:

      猜你喜欢
      • 2018-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-04
      • 1970-01-01
      相关资源
      最近更新 更多