【问题标题】:Irregularities when adding controls to my panel - they show up wherever they want向我的面板添加控件时出现异常 - 它们出现在任何他们想要的地方
【发布时间】:2009-10-20 23:11:13
【问题描述】:

这是我的代码:

int ypos = 0;

public void X()
{
    MovieItem NewMovie = new MovieItem();
    NewMovie.SearchMovie(txtSearch.Text);
    NewMovie.Location = new Point(0, ypos);
    ypos += 196;

    panel1.Controls.Add(NewMovie);
}

在运行方法 X 大约 4.5 次后,添加的第 5 或第 6 项没有添加到应该添加的位置,而是在下面加载。

图片清晰:

开头的样子正确

过了一会儿,它看起来错误

我做错了什么,它不能很好地工作?

编辑: 我使用了断点,发现问题出现在第五部电影上,当时 ypos 变量在 980 左右。为什么会这样?它似乎只是跳过了那个位置。

【问题讨论】:

  • 在这些图像上获得 403 禁止。
  • 是的,imgur 出了问题。切换到 TinyPic,图像现在应该可以工作了。 :)
  • 仅供参考,两个图片链接都指向同一张图片
  • @John:我在这里看到两个不同的图像。
  • ypos只在这个函数中修改X()?

标签: c# winforms collections panel


【解决方案1】:

好的,当面板的AutoScroll 属性设置为true 并且滚动条不在其初始位置:0 时出现问题。面板将控件定位在ypos + vertical position of scroll bar!!

在添加MovieItem 之前设置AutoScroll = false;,然后在之后设置true;,但这会重置滚动条位置
或者,在设置位置时从ypos 中减去滚动条位置。

两者都解决了问题,但第二个更好(没有滚动条重置):

public void X()
{
    int vscrollPos = panel1.VerticalScroll.Value;   

    MovieItem NewMovie = new MovieItem();
    NewMovie.SearchMovie(txtSearch.Text);
    NewMovie.Location = new Point(0, ypos - vscrollPos);
    ypos += 196;

    panel1.Controls.Add(NewMovie);
}

【讨论】:

  • 我试过这个,但问题仍然存在。我不知道可能是什么问题。
  • 对不起。当我测试时,我没有滚动面板,当我这样做时,问题总是存在。在使用 Reflector 进行一些挖掘之后,我想我找到了解决方案。查看我的编辑。
  • 感谢您的回答!顺便说一句,你是怎么想出来的?
  • 我检查了 Class PanelReflector 并看到 PerformLayout() 和/或 OnLayout 方法在继续时考虑了 AutoScroll 的值,我停在那里并开始使用 AutoScroll 和观察导致我找到上述解决方案的不同行为。就是这样。
【解决方案2】:

我不知道你的类结构是怎样的,但那个空白区域看起来是关于其他控件的组成。也许某处找不到电影,因此什么也没有放映?

【讨论】:

  • 这就是黑暗,图片中显示的所有电影都是我为说明这个问题而搜索的电影,并且它们被找到了。我不明白为什么是空白。也许它与面板的高度以及内容超过 X 高度有关?我错过了什么吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多