线程间操作无效: 从不是创建控件“label1”的线程访问它。
线程间操作无效: 从不是创建控件“label1”的线程访问它。label1.Text=clientcommand; --------------------编程问答-------------------- 写上
label1.CheckForIllegalCrossThreadCalls = False
即可
--------------------编程问答-------------------- 我是使用委托的方式 。 可能是老土的方式。
void pic_Visible(bool v)
{
pic.BeginInvoke(new dpic_Visible(_pic_Visible), v );
}
public delegate void dpic_Visible(bool v);
void _pic_Visible(bool v)
{
pic.Visible = v ;
}
最后再这样调用 pic_Visible(true);
--------------------编程问答-------------------- CheckForIllegalCrossThreadCalls = false --------------------编程问答-------------------- 跳主先成 使用委托. --------------------编程问答-------------------- 在工作线程是不能操作窗口控件的,这源于。net2.0的一个限制,不能从不是创建控件的线程访问。这时候我们需要使用那个窗口(控件)的Invoke方法来处理。
以下是一段在线程操作控件的代码,中间定义了一个委托。
delegate void SetValueEventHandler(Label label, string text);
void SetValueEvent(Label label, string text)
{
label.Text = text;
}
public void do1()
{
for (int i = 0; i < 100000; i++)
{
Invoke(new SetValueEventHandler(label1, i.ToString()));
}
}
public void do2()
{
for (int i = 0; i < 100000; i++)
{
Invoke(new SetValueEventHandler(label1, "aaa" + i.ToString()));
}
}
private void button1_Click(object sender, EventArgs e)
{
System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(do1));
t.Start();
}
private void button2_Click(object sender, EventArgs e)
{
System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(do2));
t.Start();
} --------------------编程问答--------------------
Invoke(new SetValueEventHandler(label1, "aaa " + i.ToString()));
报错,提示应输入方法名;
基于多种数据库多种开发语言的模板化代码代码生成器
目前支持数据库:Access、Oracle、SQL-Server、MySQL和SQLite。
支持代码类型:asp.net、Asp、Dephi和C# WinForm
官网:http://www.DevHelper.cn
QQ群:59633049 --------------------编程问答-------------------- 除了委托以外还有没有其它更好的解决方法 --------------------编程问答-------------------- 不知你是开发的什么组件。
不过你这个问题是跨线程操作控件问题,需要判断一下InvokeRequired,贴一段代码参考
Private Delegate Sub dgShowProgress(sender As Object, e As CopyEventArgs)
Private Sub ShowProgress(sender As Object, e As CopyEventArgs) Handles MyFileOper.PercentChangedEvent
e.Cancel = blnCancel
If InvokeRequired Then
'dgShow = New dgShowProgress(AddressOf ShowProgress)
BeginInvoke(New dgShowProgress(AddressOf ShowProgress), sender, e)
Return
Else
ProgressBar1.Value = e.PercentValue
J += 1
End If
End Sub
我这个是一个文件复制显示进度表的部分代码,MyFileOper.PercentChangedEvent是在另一个线程发生的,因而处理过程牵扯到界面元素,而操作界面元素应属界面线程,因此InvokeRequired等于True,要用BeginInvoke(New dgShowProgress(AddressOf ShowProgress), sender, e)
这种方式执行此过程更新界面元素(这里是进度条的Value)。 --------------------编程问答-------------------- CheckForIllegalCrossThreadCalls = False --------------------编程问答-------------------- 建议楼主看一下brackgroundworker控件的使用方法 --------------------编程问答-------------------- 用委托 --------------------编程问答-------------------- 只要加上
Control.CheckForIllegalCrossThreadCalls = False
就行了。 --------------------编程问答--------------------
--------------------编程问答--------------------
public partial class Form1 : Form
{
/*
* 界面上有一个button,和一个textbox,点击button1时,开始一个新线程,新线程中有一个方法,从0开始计数
* 并累加,且将每一个新的数字显示到textbox1中去
* */
public Form1()
{
InitializeComponent();
}
public delegate void SetTextDelegate(int text);
private void button1_Click(object sender, EventArgs e)
{
Thread th = new Thread(new ThreadStart(SetText));
th.Start();
}
private void SetText()
{
for (int a=0;a<1000000;a++)
{
if (textBox1.InvokeRequired)
{
textBox1.Invoke(new SetTextDelegate(SetTextDo), a);
}
}
}
public void SetTextDo(int i)
{
textBox1.Text = i.ToString();
}
}
#region Windows 窗体设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要
/// 使用代码编辑器修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.button1 = new System.Windows.Forms.Button();
this.textBox1 = new System.Windows.Forms.TextBox();
this.SuspendLayout();
//
// button1
//
this.button1.Location = new System.Drawing.Point(13, 23);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(75, 23);
this.button1.TabIndex = 0;
this.button1.Text = "button1";
this.button1.UseVisualStyleBackColor = true;
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// textBox1
//
this.textBox1.Location = new System.Drawing.Point(145, 23);
this.textBox1.Name = "textBox1";
this.textBox1.Size = new System.Drawing.Size(100, 21);
this.textBox1.TabIndex = 1;
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(284, 262);
this.Controls.Add(this.textBox1);
this.Controls.Add(this.button1);
this.Name = "Form1";
this.Text = "Form1";
this.ResumeLayout(false);
this.PerformLayout();
}
支持,,,, --------------------编程问答-------------------- 各位不好意思,我是来占位的。以后用 --------------------编程问答-------------------- 用委托吧 楼主 --------------------编程问答-------------------- http://blog.csdn.net/xianfajushi/article/details/7609849 --------------------编程问答--------------------
顶! 另外还有timer --------------------编程问答--------------------
这个不错,搞了一下午,这个对我最有用了,谢谢!!!!
补充:.NET技术 , 组件/控件开发