为啥 Form1 中的 label2.Text 没有从新类更新?
Posted
技术标签:
【中文标题】为啥 Form1 中的 label2.Text 没有从新类更新?【英文标题】:Why label2.Text in Form1 is not updating from the new class?为什么 Form1 中的 label2.Text 没有从新类更新? 【发布时间】:2012-06-15 20:31:09 【问题描述】:在 Form1 中,我在设计器中有 label2,我添加了一个代码:
public void lbl2(string text)
label2.Text = text;
在我添加的新班级顶部:
private static AnimationEditor.Form1 fr1 = new AnimationEditor.Form1();
在新的类事件中,我像这样更新 label2.Text:
int ISampleGrabberCB.BufferCB(double sampleTime, IntPtr pBuffer, int bufferLen)
using (var bitmap = new Bitmap(_width, _height, _width * 3, PixelFormat.Format24bppRgb, pBuffer))
bitmap.RotateFlip(RotateFlipType.Rotate180FlipX);
if (SaveToDisc)
String tempFile = _outFolder + _frameId + ".bmp";
if (File.Exists(tempFile))
fr1.lbl2(_frameId.ToString();
else
bitmap.Save(Path.Combine(_outFolder, _frameId + ".bmp"));
_frameId++;
else
if (Images == null)
Images = new List<Bitmap>();
Images.Add((Bitmap)bitmap.Clone());
return 0;
正在更新的线路是:
fr1.lbl2(_frameId.ToString();
现在我在新类中的这一行以及公共函数的 label2.Text 的 Form1 中使用了断点,我看到 label2 文本首先更改它的 0,然后是 1,然后是 2,依此类推。
但实际上,当我实时运行应用程序时,label2 会一直将其更改为 label2 的文本
这是 Form1 按钮单击事件,当我单击它时,它会执行新的类代码:
private void button5_Click(object sender, EventArgs e)
wmv = new Polkan.DataSource.WmvAdapter(@"d:\VIDEO0040.3gp", sf);
wmv.SaveToDisc = true;
wmv.Start();
wmv.WaitUntilDone();
【问题讨论】:
用户界面被锁定是什么意思?在 Form1 中不更新其他标签,例如在 picturebox1 鼠标移动事件中,我在标签 1 中更新鼠标移动的坐标及其工作。我还尝试在运行时代码中将 label2 文本更改为“hi”以进行测试,它确实有效。所以这里穿的是别的东西。fr1
不需要是您正在使用的表单的实际引用吗?我看到fr1 = new AnimationEditor.Form1();
,这可能不是您使用的表单的同一个实例。
LarsTech AnimationEditor 是命名空间。我在 label2.Text = text; 行上使用了一个断点。在 Form1 的 lbl2 函数中,看到文本已更改。变量文本正在改变 0,1,2....
当然可以。看起来您有两种形式:一种是您正在使用的,另一种是您的班级创建的。不同的东西。
LarsTech 我现在还在 Form1 lbl2 函数中的 label2.Text = text 上使用了一个断点,并且看到文本也在发生变化,而且 label2.Text 也在变化,一旦它的 0 然后 1 然后 2.. .等等...mmmm
【参考方案1】:
我认为快速的答案是将标签的引用传递给类:
private Label lbl;
public WmvAdapter(string file, string outFolder, Label label)
// yada-yada-yada
lbl = label;
你的日常会变成:
if (File.Exists(tempFile))
lbl.Text = _frameId.ToString();
您的点击事件:
private void button5_Click(object sender, EventArgs e)
wmv = new Polkan.DataSource.WmvAdapter(@"d:\VIDEO0040.3gp", sf, this.Label2);
wmv.SaveToDisc = true;
wmv.Start();
wmv.WaitUntilDone();
更长的答案是让你的班级引发一个事件并让你的表单监听它。
让你的班级知道表单并不是最好的编码实践。
【讨论】:
Lars 但在新课程中我无法将 Form1 fr1 设为私有;它给了我选择。像 Form1 一样不存在。 我编辑了我的 Form1 代码并将其放在我的问题帖子中 Form1 代码的开头。 @user1434011 更新答案以仅传递标签而不是表单。 Lars 我尝试了你上次编辑的代码,并在 lbl.Text = _frameId.ToString(); 行的新类中我遇到异常:跨线程操作无效:控件“label2”从创建它的线程以外的线程访问。 工作!我必须像这样在新类中调用 lbl: if (lbl.InvokeRequired) lbl.Invoke(new MethodInvoker(delegate lbl.Text = _frameId.ToString(); ));以上是关于为啥 Form1 中的 label2.Text 没有从新类更新?的主要内容,如果未能解决你的问题,请参考以下文章
python3.8 tkinter为啥title 没有用,求大神解答!代码如下
javascript 为啥按钮的onclick事件不触发 按了没反应
请问用C#编写的MDI程序,为啥我从父窗口通过按钮打开子窗口时,父窗口的按钮会在子窗口中显示?
为啥html表单中用我用get能请求到页面用post不能请求到页面啊??