真的小白 发表于 2020-8-31 21:49

c#小白请教各位大佬一个问题

请问一下各位大佬,图片中是一个继承自 Component 类的一个组件类,有一个 Control 类的自动属性 TargetControl 。在设计器添加了这个组件,并且设置 TargetControl 的值为窗体上的一个 Panel 。当程序运行时,应该怎么避免出现图中的异常?




public class DragControlMoveForm : Component
        {
                public Control TargetControl { get; set; }

                public DragControlMoveForm()
                {
                        TargetControl.MouseDown += TargetControl_MouseDown;
                }

                private void TargetControl_MouseDown(object sender, MouseEventArgs e)
                {
                        if (e.Button == MouseButtons.Left)
                        {
                                BaseTool.DragMove(TargetControl);
                        }
                }
        }

goldli 发表于 2020-8-31 23:05

本帖最后由 goldli 于 2020-8-31 23:07 编辑

private TargetControl_target;

publick TargetControlTargetControl
{
   get => _target;
set =>{
   if (value != null && !value.equals(_target))
   {
      _target = value;
      _target.xxxx = xxxxx;
   }
   }
}

zixuan203344 发表于 2020-8-31 22:05

这个属性要具体实例化对象才能设置吧,你这直接写到构造函数里面,是不是不对?

hackgsl 发表于 2020-8-31 22:07

TargetControl.MouseDown += TargetControl_MouseDown;换成:
TargetControl.MouseDown(null,null);呢

真的小白 发表于 2020-8-31 22:21

zixuan203344 发表于 2020-8-31 22:05
这个属性要具体实例化对象才能设置吧,你这直接写到构造函数里面,是不是不对?

实例化后,在这个类里面使用的就成了刚刚实例化的那个了,而不是传入的 Panel 组件了。。。

momosys 发表于 2020-8-31 22:21

构造函数中需要先调用
InitializeComponent();方法初始化窗口控件才能继续其他操作

public DragControlMoveForm()
{
InitializeComponent();
TargetControl.MouseDown += TargetControl_MouseDown;
}


真的小白 发表于 2020-8-31 22:31

momosys 发表于 2020-8-31 22:21
构造函数中需要先调用
InitializeComponent();方法初始化窗口控件才能继续其他操作



嗯嗯,我也隐约感觉到有点不对劲了,但还是摸不着头脑。
这是个非可视化组件,没有 InitializeComponent() 方法。。。

bookaccount 发表于 2020-8-31 22:40

不知道你是怎么调用的。避免出错很简单,加个判断:
      public DragControlMoveForm()
      {
            if (TargetControl != null)
            {
               TargetControl.MouseDown += TargetControl_MouseDown;
            }
      }

jajazhou 发表于 2020-8-31 22:49

bookaccount 发表于 2020-8-31 22:40
不知道你是怎么调用的。避免出错很简单,加个判断:
      public DragControlMoveForm()
      {


是的,当你设计状态,TargetControl没有赋值的时候,就是null, 加个判断即可

真的小白 发表于 2020-8-31 22:52

bookaccount 发表于 2020-8-31 22:40
不知道你是怎么调用的。避免出错很简单,加个判断:
      public DragControlMoveForm()
      {


加个判断是可以避免出错,但是新的问题又出现了。
不管是否实例化 TargetControl ,它始终接收不到我在属性面板里设置的 panel1 对象了。
我的想法很简单,就是在 DragControlMoveForm 这个非可视化组件类里,定义一个 Control 类型的 TargetControl 属性,用来接收需要执行操作的组件,然后传进来的那个组件的操作就在这个类里实现。
现在的问题是,传进来的是个 null ,传不进来。。。。。。。
页: [1] 2
查看完整版本: c#小白请教各位大佬一个问题