C# 为什么Form1中的label2.Text没有从新类更新?

C# 为什么Form1中的label2.Text没有从新类更新?,c#,C#,在Form1中,我在设计器中添加了label2,并添加了一个代码: public void lbl2(string text) { label2.Text = text; } 在新的top类中,我添加了: private static AnimationEditor.Form1 fr1 = new AnimationEditor.Form1(); 在新的类事件中,我将更新label2。文本如下: int ISampleGrabberCB

在Form1中,我在设计器中添加了label2,并添加了一个代码:

public void lbl2(string text)
        {
            label2.Text = text;
        }
在新的top类中,我添加了:

private static AnimationEditor.Form1 fr1 = new AnimationEditor.Form1();
在新的类事件中,我将更新label2。文本如下:

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;
        }
现在我在新类的这一行中使用了断点,在公共函数中的label2.Text的Form1中也使用了断点,我看到label2的文本先是0,然后是1,然后是2,依此类推

但事实上,当我运行应用程序时,label2会实时更改它的所有时间,文本状态为label2

这是我单击Form1按钮时的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();
        }

我认为快速的答案是将标签的引用传递给班级:

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();
}
较长的答案是让你的班级提出一个事件,并让你的表格倾听


让您的班级了解表单并不是最佳的编码实践。

我认为快速的答案是将标签的引用传递给班级:

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();
}
较长的答案是让你的班级提出一个事件,并让你的表格倾听



让您的类知道表单不是最佳编码实践。

UI被锁定是什么意思?不在Form1 im更新其他标签,如picturebox1鼠标移动事件i在标签1中更新鼠标移动及其工作的坐标。我还尝试在运行时代码中将label2文本更改为“hi”进行测试,结果成功了。所以这里有些东西在起作用,有些东西在起作用。
fr1
不需要实际引用您正在使用的表单吗?我看到
fr1=newanimationeditor.Form1(),可能与您使用的表单实例不同。LarsTech AnimationEditor是名称空间。我在label2行上使用了一个断点。Text=Text;在Form1中的lbl2函数中,看到文本已更改。变量文本正在更改0,1,2…请确保它正常工作。看起来您有两个表单:一个是您正在使用的表单,另一个是您的类创建的表单。不同的东西。LarsTech我现在还在label2上使用了一个断点。Form1 lbl2函数中的Text=Text,看到文本也在变化,label2也在变化。文本在0之后变化,然后是1,然后是2…等等…mmmm你说UI被锁定是什么意思?不在Form1 im更新其他标签,如picturebox1鼠标移动事件i在标签1中更新鼠标移动及其工作的坐标。我还尝试在运行时代码中将label2文本更改为“hi”进行测试,结果成功了。所以这里有些东西在起作用,有些东西在起作用。
fr1
不需要实际引用您正在使用的表单吗?我看到
fr1=newanimationeditor.Form1(),可能与您使用的表单实例不同。LarsTech AnimationEditor是名称空间。我在label2行上使用了一个断点。Text=Text;在Form1中的lbl2函数中,看到文本已更改。变量文本正在更改0,1,2…请确保它正常工作。看起来您有两个表单:一个是您正在使用的表单,另一个是您的类创建的表单。不同的东西。LarsTech我现在还在label2上使用了一个断点。在Form1 lbl2函数中Text=Text,并且看到文本也在变化,label2也在变化。文本一旦变为0,然后变为1,然后变为2…等等…mmmmLars,但是在新的类中,我不能使私有Form1 fr1;它没有给我选择权。像Form1 dosent一样存在。我编辑了我的Form1代码,并将其放在我的问题帖子中Form1代码的开头。@user1434011更新答案以只传递标签而不是表单。Lars我尝试了您上次编辑的代码,并在新类中的lbl.Text=\u frameId.ToString()行;我收到一个异常:跨线程操作无效:从创建控件“label2”的线程以外的线程访问控件“label2”。正在工作!我必须像这样在新类中调用lbl:if(lbl.invokererequired){lbl.invoke(newmethodinvoker(delegate{lbl.Text=_frameId.ToString();}));}Lars,但在新类中我不能将私有形式设为fr1;它没有给我选择权。像Form1 dosent一样存在。我编辑了我的Form1代码,并将其放在我的问题帖子中Form1代码的开头。@user1434011更新答案以只传递标签而不是表单。Lars我尝试了您上次编辑的代码,并在新类中的lbl.Text=\u frameId.ToString()行;我收到一个异常:跨线程操作无效:从创建控件“label2”的线程以外的线程访问控件“label2”。正在工作!我必须像这样在新类中调用lbl:if(lbl.invokererequired){lbl.invoke(newmethodinvoker(委托{lbl.Text=_frameId.ToString();}));}