日期:2014-05-18  浏览次数:20823 次

自定义控件数据重复的问题
做了一个数据生成曲线的自定义控件测试可以完成预定功能了。但在实际应用中发现。当需要在一个窗体上放置两个该控件分别用于显示温度与压力时,当一个控件载入数据后,控件B没有载入数据也跟着画出和控件A一样的数据曲线。
经查,控件内部未设置静态变量。不知是何原因。
请大侠们指明个方向!

------解决方案--------------------
自己好好想想吧。这是你必然经历的bug,过了这个阶段你才真正会设计控件。

设计“一”不算本事,会把它服用到“二”以上才能发现bug。任何控件都应该在一开始编码时,就随时在宿主上放上好几个来测试,一边测试一边开发。等你自认为编写完了才去放上两个控件实例来测试,这时候已经晚了,你需要推倒重来从头开始考虑自己是否真的理解了控件开发方法。
------解决方案--------------------
给你个例子,自己扩充吧
C# code

//自定义绘图类,里面包含以下代码

    public interface IMyDraw   //绘图接口
    {
        void Draw(System.Drawing.Graphics g);
    }
    public class MyDraw_Circle : IMyDraw  //绘制圆形类
    {
        public void Draw(System.Drawing.Graphics g)
        {
            g.DrawEllipse(System.Drawing.Pens.Red, new System.Drawing.Rectangle(0, 0, 100, 100));
        }
    }
    public class MyDraw_Rect : IMyDraw  //绘制矩形类
    {
        public void Draw(System.Drawing.Graphics g)
        {
            g.DrawRectangle(System.Drawing.Pens.Red, new System.Drawing.Rectangle(0, 0, 100, 100));
        }
    }

//自定义组件
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class UserControl1 : UserControl
    {
        IMyDraw _mydraw;
        public UserControl1()
        {
            InitializeComponent();
        }
        public UserControl1(IMyDraw mydraw)  //自定义构造,传入绘图接口
        {
            _mydraw = mydraw;
        }
        protected override void OnPaint(PaintEventArgs e)
        {
            _mydraw.Draw(e.Graphics); //调用接口的Draw
            base.OnPaint(e);
        }
    }
}


调用
            UserControl1 u = new UserControl1(new MyDraw_Circle());//这个绘制圆形
            u.Parent = this;
            u.Left = 0;
            u.Top = 300;
            u = new UserControl1(new MyDraw_Rect());//这个绘制矩形
            u.Parent = this;
            u.Left = 200;
            u.Top = 300;

------解决方案--------------------
很难想象是啥错,单从毛病上起码可以想到5,6种常见的错误
1.是lz自己提到的静态
2.直接引用了对象,而不是new滴
3.公用了数据源
4.dc获取错了??
5 或者使用了非线程安全的东西,两线程互相串改数据??