如何从静态类中调用其他类中的方法

时间:2019-08-08 09:23:30

标签: c# winforms oop

我绝对没有OOP经验。我是大学一年级学生,实习项目要求我使用C#进行表单申请。

我有两个类,一个表单类Form和一个静态类“ Port_Com”,在其中编写了与Raspberry通信的函数。

这是我想从第二堂课中调用的方法:


public partial class Form1 : Form
{
    {...}
    public void WriteLine(string message)
        {
            this.richTextBox1.AppendText(Environment.NewLine + ">" + message);
        }
}

我的第二堂课:


public class Port_Com
{
    private static void Main()
    {
    Form1 form = new Form1();
    form.WriteLine("test");
    }
}

基本上我想在我的富文本框中显示一个日志。

5 个答案:

答案 0 :(得分:1)

您应该 find Form1实例或 create 实例,然后调用该方法:

 using System.Linq;
 ... 
 //TODO: Main is a specific name (entry point of the exe), I suggest renaming it
 private static void Main() {
    // Do we have opened Form1? 
    Form1 form = Application
      .OpenForms        // from all opened forms
      .OfType<Form1>()  // we want just Form1 instances
      .LastOrDefault(); // If we have several, let's take the last one

    // Comment out this fragment if you don't want to create it
    if (null == form) { 
      // No open Form1 forms found
      form = new Form1(); // Let's create Form1 instance manually
      form.Show();        // And Show it
    }
    else {
      // form has been found; but you may want

      // Resore it if it's minimized 
      if (form.WindowState == FormWindowState.Minimized)
        form.WindowState = FormWindowState.Normal;
      // Bring it to front
      form.BringToFront();
      // Set keyboard focus on it 
      if (form.CanFocus)
        form.Focus(); 
    }

    // We have a form to work with, we are ready to call the method
    if (null != form)
      form.WriteLine("Hello World!");  
    else { // No Form1 intance has been found; we can't call WriteLine
      //TODO: put relevant code here
    }             
 }

答案 1 :(得分:0)

Application.Run(new Form1()); 入口点静态方法通常会创建类似以下的主要形式:

Form1

您需要将var mainForm = new Form1(); Application.Run(mainForm ); ... mainForm.WriteLine("Hello!"); 对象保存在某个地方,然后可以调用其方法,例如:

COM

另外,最好重构日志方法以允许按here的描述从另一个线程调用它,因为窗口的控件必须仅在UI线程中更新。由于这是与public void WriteLine(string message) { if (this.richTextBox1.InvokeRequired) { var d = new SafeCallDelegate(WriteLine); Invoke(d, new object[] { message }); } else { this.richTextBox1.AppendText(message); } } 端口通信有关的,因此很有可能也会从后台线程调用它。喜欢:

 $request->validate([
            'username' => 'string',
            'password' => 'required|string',
        ]);
        $credentials = ['username' =>$request->get('username'), 'password' =>$request->get('password')];

        try {

            if(!Auth::attempt($credentials))
                return response()->json([
                    'message' => 'Unauthorized'
                ], 401);

            $user = $request->user();
            $tokenResult = $user->createToken('Personal Access Token');
            $token = $tokenResult->token;
            if ($request->remember_me)
                $token->expires_at = Carbon::now()->addWeeks(1);
            $token->save();
            return response()->json([
                'access_token' => $tokenResult->accessToken,
                'token_type' => 'Bearer',
                'expires_at' => Carbon::parse(
                    $tokenResult->token->expires_at
                )->toDateTimeString()
            ]);

        } catch(Exception $e){
            echo $e;
        }

答案 2 :(得分:0)

没有实例就不能调用非静态函数。当函数是非静态的时,您需要一个类的实例。 要调用表单类,您需要执行以下操作:

From1 frm = new Form1();
frm.WriteLine("text");

答案 3 :(得分:0)

我认为您应该在Port_Com类中定义一个静态事件。表单准备好后,注册事件。如果Port_Com可以告诉表单显示内容,则触发事件。

number_of_combinations

答案 4 :(得分:0)

这取决于您的应用程序处于什么状态... 我假设您有一个运行的WinForms应用程序,其中至少有一个打开的Form。 然后,您可以使用Application.OpenForms来搜索Form并调用方法 例如

Form1 instance = Application.OpenForms.OfType<Form1>().Single();
instance.WriteLine(...);