【问题标题】:Use a variable declared in one form, in another form c#使用以一种形式声明的变量,以另一种形式c#
【发布时间】:2016-11-04 19:11:19
【问题描述】:

我在这里有一个小项目,我在这里声明了一个名为“dir”的变量,其中一个目录是在我的名为 main.cs 的表单中的文件夹浏览器对话框中选择的:

namespace XmoSupportTools
{
public partial class Main : Form
{
    public string dir;

    public FolderBrowserDialog xmodialog { get; private set; }
    public DialogResult xmodialogresult { get; private set; }

    //metoder der bliver brugt senere
    public void startxmo()
    {
        string startfile = dir + "\\xmo.exe";
        Process xmoappli = new Process();

        if (File.Exists(startfile))
        {
            xmoappli.StartInfo.FileName = startfile;
            xmoappli.Start();
        }
        else
        {
            MessageBox.Show("XMO.exe blev ikke fundet på den valgte lokation!");
            File.Delete(dir + "\\xmo.ini");
            dialog();
        }

    }

    public void dialog()
    {

        xmodialog = new FolderBrowserDialog();
        xmodialog.Description = "Find dit XMO Directory:";
        xmodialogresult = xmodialog.ShowDialog();
        if (xmodialogresult == DialogResult.OK)
        {
            dir = xmodialog.SelectedPath;

        }

我想在名为 Kunde.cs 的第二种形式中使用那个“dir”变量:

public void startxmo()
    {
        string startfile = dir + "\\xmo.exe";
        Process xmoappli = new Process();

        if (File.Exists(startfile))
        {
            xmoappli.StartInfo.FileName = startfile;
            xmoappli.Start();
        }
        else
        {
            MessageBox.Show("XMO.exe blev ikke fundet på den valgte lokation!");
            File.Delete(dir + "\\xmo.ini");
            dialog();
        }

    }

【问题讨论】:

  • 在名为 Kunde 的表单中创建一个公共变量,然后像 var _myForm = new Kunde();然后你可以做 _myForm.PublicVariableName = dir (其中 PublicVariableName 是你给变量的名字)

标签: c# forms


【解决方案1】:

您在哪里创建 Kunde.cs 表单的实例?也许您可以通过 kunde.cs 的自定义 custructor 的参数传递 dir;有点像(虽然它是来自稍微不同的上下文的代码,但它仍然使用相同的样式。)-

private void button_login(object sender, EventArgs e)
{
   MainMenu ss= new MainMenu(textBox1.Text);
   this.Hide();            
   ss.Show();
}

class MainMenu : Form
{
    // This is an "Auto-Implemented Property".
    // Auto-Implemented Properties are used as a shortcut of what you have done.
    // Google them for more information.
    public string UserName { get; set; }

    private void MainMenu(string userName)
    {
        this.UserName = userName;
    }
}

【讨论】:

    【解决方案2】:

    在 program.cs 中将 mainform 实例设置为 public static

    public static Lapphantering mainForm;        
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    
    static void Main()
    {
        mainForm = new Mainform(); // create instance of Lapphantering
        Application.Run(mainForm);
    }
    

    在你的主窗体中:

       public partial class Main : Form
       {
          public string dir;
    
           //code
       }
    

    在你的其他班级:

     public void startxmo()
     {
    
        //access dir variable from main form instance in program.cs
        string startfile = program.mainform.dir + "\\xmo.exe";
        Process xmoappli = new Process();
    
        if (File.Exists(startfile))
        {
            xmoappli.StartInfo.FileName = startfile;
            xmoappli.Start();
        }
        else
        {
            MessageBox.Show("XMO.exe blev ikke fundet på den valgte lokation!");
            File.Delete(program.mainform.dir + "\\xmo.ini");
            dialog();
        }
    
    }
    

    所以现在你可以在每个类中通过 main 访问字符串 dir Program.cs 主窗体实例。

    【讨论】:

    • 为什么public static string dir; 是静态的?
    • 啊,抱歉,我没看到我修改了它
    【解决方案3】:

    您可以尝试在表单 2 (Kunde.cs) 上创建一个带有参数的公共类,并将您调用的代码插入到该类中。从主窗体调用该函数并传递参数。例如:

    //this should be on 2nd form
    public void sampleFunction (string dir)
    {
       //paste your code here
    }
    
    //this is how you will call it on main form
    form2.sampleFunction(dir);
    

    【讨论】:

      【解决方案4】:

      这在很大程度上取决于应用程序的生命周期,我并不真正精通 winforms,但是,如果您可以将 Kunde 类与 Main 类挂钩,例如像这样:

      public partial class Main : Form
      {
        private Kunde _kunde;
      
        public Main(Kunde kunde)
        {
           _kunde = kunde;
        }
      
        public void dialog()
        {
          xmodialog = new FolderBrowserDialog();
          xmodialog.Description = "Find dit XMO Directory:";
          xmodialogresult = xmodialog.ShowDialog();
          if (xmodialogresult == DialogResult.OK)
          {
              dir = xmodialog.SelectedPath;
              _kunde.Dir = dir;
          }
        }
      
        // rest of your code...
      }
      
      public class Kunde 
      {
        public string Dir { get; set; }
      
        public void startxmo()
        {
          string startfile = Dir + "\\xmo.exe";
          Process xmoappli = new Process();
      
          if (File.Exists(startfile))
          {
              xmoappli.StartInfo.FileName = startfile;
              xmoappli.Start();
          }
          else
          {
              MessageBox.Show("XMO.exe blev ikke fundet på den valgte lokation!");
              File.Delete(dir + "\\xmo.ini");
              dialog();
          }
        }
      }
      

      然后使用例如AutofacSimple Injector 或其他类型的 DI 框架将 Kunde 对象注入到表单中。

      本质上,您正在寻找观察者模式的简单实现,其中 Kunde 对象观察 Main 表单,方式简单,不需要动态注册或注销,因此您可以通过构造函数注入修复依赖关系。

      【讨论】:

        【解决方案5】:

        您可以在 Kunde.cs 中通过编写简单地做到这一点

        System.Windows.Forms.Form f = System.Windows.Forms.Application.OpenForms["MainForm"]; 
        //Whatever is the Name of the Form
        //than
        string kundedir = ((MainForm)f).dir;
        

        另一种方法是你可以创建一个参数化的构造函数来调用 Kunde 然后在 MainForm 中

        Kunde k = new Kunde(dir);
        

        在 Kunde.cs 中

        string kundedir;
        Kunde(string dirval)
        {
            kundedir = dirval;
        }
        

        【讨论】:

        • 在您建议的第一个选项中,将创建 MainForm 的一个新实例。这是不必要的矫枉过正。
        【解决方案6】:

        您可以将创建dir 设置为static 变量,并将保护级别设置为您希望变量dir 可访问应用程序中的其他表单的程度

        {access specifier} static int dir = "path";
        

        {access specifier} 可以是 publicprotected internalprotected 等,视情况而定。

        然后通过点符号调用dir

        Main.dir.ToString();
        

        例如

        public partial class Form1 : Form
        {
            protected internal static int dir = 54;
        
            public Form1()
            {
                InitializeComponent();
            }
        
            private void Form1_Load(object sender, EventArgs e)
            {
                Form2 a = new Form2();
                a.Show();
            }
        }
        
        public partial class Form2 : Form
        {
            public Form2()
            {
                MessageBox.Show(Form1.dir.ToString());
                InitializeComponent();
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-10-23
          • 1970-01-01
          • 1970-01-01
          • 2021-05-13
          • 1970-01-01
          • 2021-12-22
          • 1970-01-01
          相关资源
          最近更新 更多