无法将类型“System.Windows.Forms.Control”转换为“System.Windows.Forms.Timer”

时间:2022-01-10 20:34:44
Label label = (Label)Controls["label" + i]; 

我这样写,可以根据不同的i值 来获得到不同的label,没问题

Timer timer = (Timer)Controls["timer"+i];  

可同样的写法运用于Timer,就会报错,说

无法将类型“System.Windows.Forms.Control”转换为“System.Windows.Forms.Timer”






哪位大哥帮忙指点一下,谢谢

20 个解决方案

#1


timer不是从control继承的

#2


引用 1 楼 ICanUseThisID 的回复:
timer不是从control继承的 


请教,那我应该怎么写?

timer 是从哪里继承的?

#3


你查下MSDN看下Timer类不就知道了嘛。。

继承层次结构
System..::.Object
  System..::.MarshalByRefObject
    System.ComponentModel..::.Component
      System.Windows.Forms..::.Timer

#4


你的代码有问题。参照下面
if(Controls[i].GetType()==Typeof(Timer))
{
   Timer timer = (Timer)Controls[i];
}

#5



Timer t = (Timer)this.components.Components[0];

#6


引用 4 楼 Yali8 的回复:
你的代码有问题。参照下面 
if(Controls[i].GetType()==Typeof(Timer)) 

  Timer timer = (Timer)Controls[i]; 
}


谢谢。但是还是一样的错误

#7


引用 5 楼 ICanUseThisID 的回复:
C# code
Timer t = (Timer)this.components.Components[0];


不行呀。。

#8


如果你的timer是从工具箱拖的,设计器在InitializeComponent方法中会自动添加

this.timer1 = new System.Windows.Forms.Timer(this.components);


这样的话只能通过索引来取得组件,

this.components.Components[0];


如果要能够通过组件名称取得组件,比如

this.components.Components["timer1"];

则需要自己手动添加timer,比如:

Timer timer1 = new Timer();
this.components.Add(timer1, "timer1");

#9


8楼

Timer timer1 = new Timer();
this.components.Add(timer1, "timer1");

我用你的这个方法,系统提示

重复的组件名称“timer1”。组件名称必须唯一且不区分大小写。

#10


            foreach (object obj in this.components.Components)
            {
                if (obj.GetType() == typeof(Timer))
                {
                    Timer timer2 = (Timer)obj;
                }
            }

#11


            Timer _Time = (Timer)this.GetType().GetField("timer1",BindingFlags.NonPublic|BindingFlags.Instance).GetValue(this);
            _Time.Tick += new EventHandler(_Time_Tick);
            _Time.Interval = 100;
            _Time.Enabled = true;


        void _Time_Tick(object sender, EventArgs e)
        {
            this.Text = DateTime.Now.Second.ToString();
        }

#12


引用 9 楼 jianlanzq 的回复:
8楼

Timer timer1 = new Timer();
this.components.Add(timer1, "timer1");

我用你的这个方法,系统提示

重复的组件名称“timer1”。组件名称必须唯一且不区分大小写。

我只是打个比方,你换一下名字不就可以啦 无法将类型“System.Windows.Forms.Control”转换为“System.Windows.Forms.Timer”

#13


引用 11 楼 zgke 的回复:
            Timer _Time = (Timer)this.GetType().GetField("timer1",BindingFlags.NonPublic|BindingFlags.Instance).GetValue(this); 
            _Time.Tick += new EventHandler(_Time_Tick); 
            _Time.Interval = 100; 
            _Time.Enabled = true; 


        void _Time_Tick(object sender, EventArgs e) 
        { 
            this.Text = DateTime.Now.Second.ToString(); 
        }


未将对象引用设置到对象的实例。

#14


引用 12 楼 ICanUseThisID 的回复:
引用 9 楼 jianlanzq 的回复:
8楼 

Timer timer1 = new Timer(); 
this.components.Add(timer1, "timer1"); 

我用你的这个方法,系统提示 

重复的组件名称“timer1”。组件名称必须唯一且不区分大小写。 
 
我只是打个比方,你换一下名字不就可以啦


嗯。我知道,我换过的。

我换成timer2,就提示重复timer2

我是这样
Timer t= new Timer(); 
this.components.Add(t, "timer"+i); 

都不行

#15


引用 10 楼 Yali8 的回复:
            foreach (object obj in this.components.Components) 
            { 
                if (obj.GetType() == typeof(Timer)) 
                { 
                    Timer timer2 = (Timer)obj; 
                } 
            }


这样的话怎么通过名称来获得呢?

#16


手动添加Timer之前先判断一下
[C#=Code]
if (this.components == null)
            {
                this.components = new System.ComponentModel.Container();
            }
[/Code]

#17


你一定要通过名称的话,可以利用Timer的Tag贮存Timer的名称,如timer1.
            foreach (object obj in this.components.Components)
            {
                if (obj.GetType() == typeof(Timer))
                {
                    Timer timer2 = (Timer)obj;
                    string objName = (string)timer2.Tag;
                    if(objName=="timer1")
                    {
                      //.......
                    }
                    else if(objName=="timer2")
                    {
                      //....
                    }
                }
            }

#18


引用 16 楼 ICanUseThisID 的回复:
手动添加Timer之前先判断一下 
[C#=Code] 
if (this.components == null) 
            { 
                this.components = new System.ComponentModel.Container(); 
            } 
[/Code]


这样吗

            if (this.components == null)
            {
                this.components = new System.ComponentModel.Container();
                Timer t = new Timer();
                this.components.Add(t, "timer" + begin);
                t.Start();
            }


这次没有错误了,但是没有运行里面的代码

#19


你没有绑定事件啊

t.Tick += new EventHandler(t_Tick);

#20


up
学习了...

#1


timer不是从control继承的

#2


引用 1 楼 ICanUseThisID 的回复:
timer不是从control继承的 


请教,那我应该怎么写?

timer 是从哪里继承的?

#3


你查下MSDN看下Timer类不就知道了嘛。。

继承层次结构
System..::.Object
  System..::.MarshalByRefObject
    System.ComponentModel..::.Component
      System.Windows.Forms..::.Timer

#4


你的代码有问题。参照下面
if(Controls[i].GetType()==Typeof(Timer))
{
   Timer timer = (Timer)Controls[i];
}

#5



Timer t = (Timer)this.components.Components[0];

#6


引用 4 楼 Yali8 的回复:
你的代码有问题。参照下面 
if(Controls[i].GetType()==Typeof(Timer)) 

  Timer timer = (Timer)Controls[i]; 
}


谢谢。但是还是一样的错误

#7


引用 5 楼 ICanUseThisID 的回复:
C# code
Timer t = (Timer)this.components.Components[0];


不行呀。。

#8


如果你的timer是从工具箱拖的,设计器在InitializeComponent方法中会自动添加

this.timer1 = new System.Windows.Forms.Timer(this.components);


这样的话只能通过索引来取得组件,

this.components.Components[0];


如果要能够通过组件名称取得组件,比如

this.components.Components["timer1"];

则需要自己手动添加timer,比如:

Timer timer1 = new Timer();
this.components.Add(timer1, "timer1");

#9


8楼

Timer timer1 = new Timer();
this.components.Add(timer1, "timer1");

我用你的这个方法,系统提示

重复的组件名称“timer1”。组件名称必须唯一且不区分大小写。

#10


            foreach (object obj in this.components.Components)
            {
                if (obj.GetType() == typeof(Timer))
                {
                    Timer timer2 = (Timer)obj;
                }
            }

#11


            Timer _Time = (Timer)this.GetType().GetField("timer1",BindingFlags.NonPublic|BindingFlags.Instance).GetValue(this);
            _Time.Tick += new EventHandler(_Time_Tick);
            _Time.Interval = 100;
            _Time.Enabled = true;


        void _Time_Tick(object sender, EventArgs e)
        {
            this.Text = DateTime.Now.Second.ToString();
        }

#12


引用 9 楼 jianlanzq 的回复:
8楼

Timer timer1 = new Timer();
this.components.Add(timer1, "timer1");

我用你的这个方法,系统提示

重复的组件名称“timer1”。组件名称必须唯一且不区分大小写。

我只是打个比方,你换一下名字不就可以啦 无法将类型“System.Windows.Forms.Control”转换为“System.Windows.Forms.Timer”

#13


引用 11 楼 zgke 的回复:
            Timer _Time = (Timer)this.GetType().GetField("timer1",BindingFlags.NonPublic|BindingFlags.Instance).GetValue(this); 
            _Time.Tick += new EventHandler(_Time_Tick); 
            _Time.Interval = 100; 
            _Time.Enabled = true; 


        void _Time_Tick(object sender, EventArgs e) 
        { 
            this.Text = DateTime.Now.Second.ToString(); 
        }


未将对象引用设置到对象的实例。

#14


引用 12 楼 ICanUseThisID 的回复:
引用 9 楼 jianlanzq 的回复:
8楼 

Timer timer1 = new Timer(); 
this.components.Add(timer1, "timer1"); 

我用你的这个方法,系统提示 

重复的组件名称“timer1”。组件名称必须唯一且不区分大小写。 
 
我只是打个比方,你换一下名字不就可以啦


嗯。我知道,我换过的。

我换成timer2,就提示重复timer2

我是这样
Timer t= new Timer(); 
this.components.Add(t, "timer"+i); 

都不行

#15


引用 10 楼 Yali8 的回复:
            foreach (object obj in this.components.Components) 
            { 
                if (obj.GetType() == typeof(Timer)) 
                { 
                    Timer timer2 = (Timer)obj; 
                } 
            }


这样的话怎么通过名称来获得呢?

#16


手动添加Timer之前先判断一下
[C#=Code]
if (this.components == null)
            {
                this.components = new System.ComponentModel.Container();
            }
[/Code]

#17


你一定要通过名称的话,可以利用Timer的Tag贮存Timer的名称,如timer1.
            foreach (object obj in this.components.Components)
            {
                if (obj.GetType() == typeof(Timer))
                {
                    Timer timer2 = (Timer)obj;
                    string objName = (string)timer2.Tag;
                    if(objName=="timer1")
                    {
                      //.......
                    }
                    else if(objName=="timer2")
                    {
                      //....
                    }
                }
            }

#18


引用 16 楼 ICanUseThisID 的回复:
手动添加Timer之前先判断一下 
[C#=Code] 
if (this.components == null) 
            { 
                this.components = new System.ComponentModel.Container(); 
            } 
[/Code]


这样吗

            if (this.components == null)
            {
                this.components = new System.ComponentModel.Container();
                Timer t = new Timer();
                this.components.Add(t, "timer" + begin);
                t.Start();
            }


这次没有错误了,但是没有运行里面的代码

#19


你没有绑定事件啊

t.Tick += new EventHandler(t_Tick);

#20


up
学习了...

#21