【问题标题】:How to access controls that is in the panel in c#如何访问 C# 面板中的控件
【发布时间】:2010-11-18 14:51:57
【问题描述】:

我在 c# winforms 中使用面板,并使用循环填充面板与图片框的编号

例如面板名称是panal

foreach (string s in fileNames)
{            
    PictureBox pbox = new new PictureBox();
    pBox.Image = Image.FromFile(s);
    pbox.Location = new point(10,15);
    .
    .
    .
    .
    this.panal.Controls.Add(pBox);
}

现在我想用另一种方法更改图片框的位置。 问题是我现在如何访问图片框以便更改它们的位置。 我尝试使用以下方法,但没有成功。

foreach (Control p in panal.Controls)
                if (p.GetType == PictureBox)
                   p.Location.X = 50;

但是有一个错误。错误是:

System.Windows.Forms.PictureBox' is a 'type' but is used like a 'variable'

【问题讨论】:

  • 错误是什么?这也是WPF还是Winforms?您提供的详细信息越多,您就越有可能得到您正在寻找的答案。
  • 我使用winforms,错误是System.Windows.Forms.PictureBox' is a 'type' but is used like a 'variable'
  • @qulzam: C. Ross 的代码会解决你的问题

标签: c# winforms desktop-application


【解决方案1】:

本节中似乎有一些拼写错误(并且可能是真正的错误)。

foreach (Control p in panal.Controls)
                if (p.GetType == PictureBox.)
                   p.Location.X = 50;

错别字是

  1. PictureBox 后跟一个句点 (.)
  2. GetType 缺少括号(因此未调用)。

错误是:

  • p的类型不能和PictureBox比较,需要和PictureBox的类型比较。

这应该是:

foreach (Control p in panal.Controls)
   if (p.GetType() == typeof(PictureBox))
      p.Location = new Point(50, p.Location.Y);

或者简单地说:

foreach (Control p in panal.Controls)
   if (p is PictureBox)
      p.Location = new Point(50, p.Location.Y);

【讨论】:

  • +1。为了使答案完整,我想指出原始代码 sn-p 中的拼写错误和错误可能是个好主意。
  • 也可以使用Controls.OfType(),而不是缩短代码。
  • 在 (p.Location.X = 50;) 行中是错误的,即无法修改 'System.Windows.Forms.Control.Location' 的返回值,因为它不是变量
【解决方案2】:

试试这个:

foreach (Control p in panal.Controls)
{
    if (p is PictureBox)
    {
        p.Left = 50;
    }
}

【讨论】:

  • 感谢MusiGenesis。我解决它。我仍然知道为什么( p.x = 50; )是错误的并给出错误。如果我们使用 ( p.Location = new point(50,10); ) 是正确的。我认为新点也等于 x 和 y 值。谁能解释一下?
  • 我无法解释,但这将是一个很好的 StackOverflow 问题。
  • 我认为 PictureBox.Location.x 是只读属性。所以我们不能改变或写它。
  • 是的,但你问了一个我从未真正想过的问题:为什么点(或任何控件)中的 X 和 Y 是只读的?可能有一个很好的理由,但我从来没有遇到过。
【解决方案3】:

接下来你的 for 循环中可能会有一些错误。

foreach (Control p in panel.Controls)
{
  if (p is PictureBox) // Use the keyword is to see if P is type of Picturebox
  {
     p.Location.X = 50;
  }
}

【讨论】:

  • 我在 p.Location.x = 50 行中收到以下错误;错误1 不能修改'System.Windows.Forms.Control.Location'的返回值,因为它不是变量
  • 将已知控件转换为 PictureBox:If (p is PictureBox) { PictureBox pb = (PictureBox)p }
【解决方案4】:

我认为

foreach (PictureBox p in panel.Controls.OfType<PictureBox>())
        {
            p.Location = new Point(50, p.Location.Y);
        }

也可以解决。

【讨论】:

    【解决方案5】:

    你不想

    panel.Controls
     //^ this is an 'e'
    

    而不是

    panal.Controls?
     //^ this is an 'a'
    

    【讨论】:

    • 他们会......但这不会导致错误,这只是控件的名称并且拼写不可知。
    • 好吧,我不知道如果他不说他得到了什么错误
    【解决方案6】:

    在您的第二个块中,p.GetType == PictureBox 之后的句点是错误的(此处不需要句点)...就此而言,GetType 是一种方法/函数而不是属性,因此它需要是 p.GetType()

    【讨论】:

      【解决方案7】:

      最好将图片框设置为表单本身的私有变量,这样您就可以使用它进行操作,而不必每次都通过面板的控件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-16
        • 1970-01-01
        • 2013-02-17
        相关资源
        最近更新 更多