哈哈,我们又见面了.没有见到你的code,所以我自己写了一个. 估计你也能看懂,请自己比较一下.
如有什么不一样,请贴一段代码上来说说你是如何使用的./*---------------------(代码开始)---------------*/
using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;namespace WindowsAppTmp
{
/// <summary>
/// UserControl1 的摘要说明。
/// </summary>
public class UserControl1 : System.Windows.Forms.Panel
{
/// <summary> 
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.Container components = null;
private System.Windows.Forms.ErrorProvider myErrorProvider; public UserControl1()
{
// 该调用是 Windows.Forms 窗体设计器所必需的。
InitializeComponent(); myErrorProvider = new ErrorProvider(); int myTop = 10;
int myHeight = (this.Height - 60) /5;

for(int i = 0; i < 5; i++)
{
Panel p = new Panel();
p.Location = new Point(5,myTop);
p.Size = new Size(this.Width - 10,myHeight);
p.BackColor = System.Drawing.Color.Blue;
p.BringToFront();
this.Controls.Add(p); myTop += myHeight + 10;
} } /// <summary> 
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if(components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
} #region Component Designer generated code
/// <summary> 
/// 设计器支持所需的方法 - 不要使用代码编辑器 
/// 修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
components = new System.ComponentModel.Container();
}
#endregion public void SetMyError()
{ this.myErrorProvider.SetError(this,"Error");
}
}
}
/*---------------------(代码结束)---------------*/

解决方案 »

  1.   

    班门斧,你好。本来,我是打算让曾经碰到我类似情况的朋友帮我指点一下的,再加上控件代码很长,所以没有给出代码。我需要的只是提示,不是详细的实现代码。真没想到,你亲自编写并测试了代码来帮助我,真是太感谢了。你的代码很通俗,与我的几乎一致。因为我的这个控件相当庞大复杂,是这个方案中,与核心算法处于同等重要地位的核心控件,用来描述核心算法的计算结果。而这个核心算法非常复杂,在大部分情况下计算量很大,甚至几个小时都有可能,所以我采用了异步调用来实现用户界面的。同样,我是在测试核心算法的环境中来测试这个核心控件的,在异步调用核心算法结束时的异步回调方法中获取计算结果,并将此结果赋给核心控件的一个属性。在属性 set 时,调用重画功能。然而,可能正是这个异步回调,使得程序运行并非如预想的那样。后来,我把这个计算结果保存在一个主窗体的变量中,用一个点击事件再将此结果赋给核心控件的属性,程序运行很正常。说明我的控件其实没问题,只是调用方式上有问题。我原来以为异步调用的回调方法是执行在主线程上的,现在看来不是这么回事,但是我又该如何在异步回调方法执行时,直接将此结果赋给核心控件的属性呢?
    注意,核心控件不对外部公开任何自定义方法,只有这个属性是公开的。也就是说,如果调用核心控件的方法的BeginInvoke(),是不成立的。急!急!急!
      

  2.   

    现在不急了。可以在set属性时,用 Control.InvokeRequired 属性来判断在调用Panel的Add 或 AddRange 方法时,是否需要使用 Invoke 方法。详细说明请见 .Net 帮助文档中有关 Control.InvokeRequired 的部分。