为啥 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不能请求到页面啊??

C# 写了form1_Closed事件可是调试运行是关闭后没响应代码

html一个Form两个提交按钮分别实现不同提交页面的功能,点击按钮没反应的问题?