使用以一种形式声明的变量,使用另一种形式c#

时间:2016-11-04 09:45:37

标签: c# forms

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

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();
        }

    }

6 个答案:

答案 0 :(得分:1)

您可以尝试使用表单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);

答案 1 :(得分: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 :(得分:1)

这在很大程度上取决于应用程序的生命周期,而且我并不精通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表单,简单的方式不需要动态注册或取消注册,因此您可以通过构造函数注入来修复依赖项。 / p>

答案 3 :(得分:1)

  

在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中的字符串目录   Program.cs mainform实例。

答案 4 :(得分:1)

您可以通过编写

在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;
}

答案 5 :(得分:0)

您可以将create dir设置为static变量,并将保护级别设置为您希望变量dir可以访问应用程序中其他表单的范围< / p>

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

{access specifier}可以是publicprotected internalprotected等,具体取决于它。

然后通过点符号调用dir

Main.dir.ToString();

e.g。

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();
    }
}