Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从另一个类更新文本框_C#_Textbox - Fatal编程技术网

C# 从另一个类更新文本框

C# 从另一个类更新文本框,c#,textbox,C#,Textbox,我正在尝试将一个名为“hex”的类中的文本框更新为主窗体。在“hex”类中,我有以下代码: Main m = new Main(); m.updateTextBox(convertedHex); 代码将变量传递给名为“updateTextBox”的方法的主窗体,如下所示: public void updateLog(string input) { textBox2.AppendText(input); } 抱歉,如果这看

我正在尝试将一个名为“hex”的类中的文本框更新为主窗体。在“hex”类中,我有以下代码:

        Main m = new Main();
        m.updateTextBox(convertedHex);
代码将变量传递给名为“updateTextBox”的方法的主窗体,如下所示:

    public void updateLog(string input)
    {
        textBox2.AppendText(input);
    }

抱歉,如果这看起来像是一个愚蠢的问题,我已经被困了一段时间,我的谷歌搜索上的所有链接现在都是紫色的,所以我希望有人能向我解释一下。非常感谢。

您的类,可能是一个业务对象,通常不应该关心UI的更新。它并不特别需要知道你甚至有一个UI。但是你可以使用几种不同的有用方法

1只需让UI调用业务对象的方法,让该方法返回一个值,然后UI就可以选择显示它

// inside Main form
var hex = new Hex();
string convertedHex = hex.GetConvertedHex(someArgument);
UpdateTextBox(convertedHex);
2让您的业务对象公开事件。该事件的参数将包括需要广播给订阅该事件的人的任何字符串。用户界面将成为其中一个订阅者


在这两个想法中,我通常会选择第一个,除非您确实需要一个事件模型

您的类(可能是一个业务对象)通常不应该关心UI的更新。它并不特别需要知道你甚至有一个UI。但是你可以使用几种不同的有用方法

1只需让UI调用业务对象的方法,让该方法返回一个值,然后UI就可以选择显示它

// inside Main form
var hex = new Hex();
string convertedHex = hex.GetConvertedHex(someArgument);
UpdateTextBox(convertedHex);
2让您的业务对象公开事件。该事件的参数将包括需要广播给订阅该事件的人的任何字符串。用户界面将成为其中一个订阅者


在这两个想法中,我通常会选择第一个,除非您确实需要一个事件模型

在创建textBox的主类中添加这种方法,并从外部调用它

假设您在Program.cs类中添加了代码以启动新的

    // Add this code in Program.cs (or similar where you start the gui
    public static readonly Main MainLogWindow = new Main();

    // Add this code in Main.cs class 
    private delegate void NameCallBack(string varText);
    public void UpdateTextBox(string input) {
        if (InvokeRequired) {
            textBox.BeginInvoke(new NameCallBack(UpdateTextBox), new object[] {input});
        } else {
            textBox.Text = input;
            // textBox.Text = textBox.Text + Environment.NewLine + input // This might work as append in next line but haven't tested so not sure
        }
    }
可以这样称呼它:Program.MainLogWindow.UpdateTextBoxtest;假设MainLogWindow已打开,则可以从任何位置


这还允许您从其他线程内调用更新。

在创建textBox的主类内添加此类方法,并从外部调用它

假设您在Program.cs类中添加了代码以启动新的

    // Add this code in Program.cs (or similar where you start the gui
    public static readonly Main MainLogWindow = new Main();

    // Add this code in Main.cs class 
    private delegate void NameCallBack(string varText);
    public void UpdateTextBox(string input) {
        if (InvokeRequired) {
            textBox.BeginInvoke(new NameCallBack(UpdateTextBox), new object[] {input});
        } else {
            textBox.Text = input;
            // textBox.Text = textBox.Text + Environment.NewLine + input // This might work as append in next line but haven't tested so not sure
        }
    }
可以这样称呼它:Program.MainLogWindow.UpdateTextBoxtest;假设MainLogWindow已打开,则可以从任何位置


这也将允许您从其他线程中调用更新。

您没有给我们提供太多的信息。但正如我在评论中所说的,如果启动表单是Main,那么显示的代码将创建一个新的主表单,对它所做的任何更改都不会显示在UI中。您需要将表单实例传递给Hex类构造函数。我会这样做,假设名称空间是相同的,它们在同一个线程上,并且您的Hex类不是静态的。如果在不同的线程上,您需要使用MadBoy显示的方法

public partial class Form1 : Form
{
    Hex hex;
    public Form1()
    {
        InitializeComponent();
        hex = new Hex(this);
    }
}


class Hex
{
    Form1 m;

    public Hex( Form1 frm)
    {
        m = frm;
        m.updateTextBox("Hello World");
    }
}

你没有给我们提供太多的信息。但正如我在评论中所说的,如果启动表单是Main,那么显示的代码将创建一个新的主表单,对它所做的任何更改都不会显示在UI中。您需要将表单实例传递给Hex类构造函数。我会这样做,假设名称空间是相同的,它们在同一个线程上,并且您的Hex类不是静态的。如果在不同的线程上,您需要使用MadBoy显示的方法

public partial class Form1 : Form
{
    Hex hex;
    public Form1()
    {
        InitializeComponent();
        hex = new Hex(this);
    }
}


class Hex
{
    Form1 m;

    public Hex( Form1 frm)
    {
        m = frm;
        m.updateTextBox("Hello World");
    }
}

jest simple无需执行所有这些操作,从属性中公开文本框,并通过如下方法将当前表单对象传递给类

public void mthod(){

//crete a obj of the class

cls1 obj=new clas1();

obj.smethod(this); 

}
现在在课堂上,你能这样计算吗

smethod(from1 obj){
obj.textbox.text="";
}

jest simple无需执行所有这些操作,从属性中公开文本框,并通过如下方法将当前表单对象传递给类

public void mthod(){

//crete a obj of the class

cls1 obj=new clas1();

obj.smethod(this); 

}
现在在课堂上,你能这样计算吗

smethod(from1 obj){
obj.textbox.text="";
}

你的创业形式是什么?如果它是Main,则您正在创建Main的新实例,并且不会更新您的UI。您的启动表单是什么?如果它是Main,那么您正在创建一个新的Main实例,并且不会更新您的UI。嘿,谢谢您的回复!我收到此错误错误无法分配给“AppendText”,因为它是“方法组”您知道我做错了什么吗,我将代码复制到命名空间WindowsPrefetchSearch{public partial class Main:Form{string root=System.IO.Path.GetPathRootEnvironment.SystemDirectory;public Main{InitializeComponent;}//将代码放在这里,非常感谢!将AppendText更改为.Text并让我知道它是否有效。我假设AppendText适合您。我已经编辑了源代码以确保它有效。如果它有效,那么您可以尝试像textBox.Text=textBox.Text+input那样使用它来模拟您想要执行的AppendText。Text似乎可以
工作,但由于某些原因,我无法从另一个类调用它,因为它在当前上下文中不存在。谢谢你的帮助!再次更新它。如果不进行测试,很难做到这一点:\n很抱歉回复太慢,但当我使用您的代码时,在program.cs中出现以下错误。在应用程序中创建第一个IWin32Window对象之前,必须调用SetCompatibleTextRenderingDefault。由于以下原因,这是一个结束。Application.SetCompatibleTextRenderingDefaultfalse;嘿,谢谢你的回复!我收到此错误错误无法分配给“AppendText”,因为它是“方法组”您知道我做错了什么吗,我将代码复制到命名空间WindowsPrefetchSearch{public partial class Main:Form{string root=System.IO.Path.GetPathRootEnvironment.SystemDirectory;public Main{InitializeComponent;}//将代码放在这里,非常感谢!将AppendText更改为.Text并让我知道它是否有效。我假设AppendText对您有效。我已编辑源代码以确保它有效。如果它有效,您可以尝试使用它,如textBox.Text=textBox.Text+input来模拟您想要执行的AppendText。Text似乎有效,但我无法调用由于某些原因,它来自另一个类,因为它在当前上下文中不存在。感谢您的帮助!再次更新了它。如果不进行测试,很难做到这一点:\n很抱歉回复太慢,但当我使用您的代码时,我在program.cs SetCompatibleTextRenderingDefault中遇到以下错误。在t中创建第一个IWin32Window对象之前,必须调用SetCompatibleTextRenderingDefault应用程序。这是一个结束,原因如下。应用程序。SetCompatibleTextRenderingDefaultfalse;非常感谢,我使用了MadBoys方法。感谢您的帮助:非常感谢,我使用了MadBoys方法。感谢您的帮助: