【问题标题】:How to get a value of variable from another form in C# [duplicate]如何从 C# 中的另一种形式获取变量的值 [重复]
【发布时间】:2014-05-05 08:01:14
【问题描述】:

我有 2 个表格。表格 1 是 mainForm,表格 2 是 WordSearch。我想将 newSystemRec 的值从 WrodSearch 传递给 mainForm。我的两个表单都可以访问 datalayer.cs 文件。我从哪里获得 WordSearch 表单中的 newSystemRec 值。 这是我的 WordSearch 代码:

public enum Category { Schematic, Component }

public partial class WordSearch : Form
{
    private DataLayer dataLayer;
    private MainForm mainForm;
    public event EventHandler<JumpToEventArgs> JumpTo;
    public event EventHandler ModeChanged;
    public event EventHandler SystemChanged;
    public event EventHandler<SimEventArgs> SimChanged;
    private SystemMode systemMode;
    private p2p p2pMode, originalMode;
    private Int32 systemRec;
    private string fileName;
    public Int32 projectRec { get; set; }

    public WordSearch(Category category, String title)
    {
        InitializeComponent();
        this.dgSearch.Style.VerticalAlignment = C1.Win.C1TrueDBGrid.AlignVertEnum.Center;
        this.Icon = Properties.Resources.TDXm;
        if (category == Category.Schematic)
            SetDefaultCategory(true, false);
        else
            SetDefaultCategory(false, true);            
        dataLayer = new DataLayer(false);
        rbRefDes.CheckedChanged += new System.EventHandler(this.rb_CheckedChanged);
        rbComp.CheckedChanged += new System.EventHandler(this.rb_CheckedChanged);
        rbSchematic.CheckedChanged += new System.EventHandler(this.rb_CheckedChanged);
        rdoTrace.Click += new EventHandler(this.rbTraceAndSim);
        rdoSim.Click += new EventHandler(this.rbTraceAndSim);
        lblModel.Text = title;
    }

    private void WordSearch_FormClosing(object sender, FormClosingEventArgs e)
    {
        if (fileName == null) return;
        if (originalMode != p2pMode)
        {
            if (ModeChanged != null)
                ModeChanged(this, EventArgs.Empty);
        }
        //Need to pass the value below
        Int32 newSystemRec = dataLayer.GetSystemType(fileName, p2pMode);
        if (systemRec != newSystemRec)
        {
            if (SystemChanged != null)
                SystemChanged(null, EventArgs.Empty);
        }
    }

这是我的主窗体:

    public Int32 newSystemRec { get; set; }

    public MainForm()
    {
        InitializeComponent();           
        InitializeP2Trace();           
        dataLayer.InsertHandler(this.Handle);
        Args = Environment.GetCommandLineArgs();
        MethodInvoker mi = new MethodInvoker(EmsJump);
        this.dgComp.Style.VerticalAlignment = C1.Win.C1TrueDBGrid.AlignVertEnum.Center;
        this.dgSchematic.Style.VerticalAlignment = C1.Win.C1TrueDBGrid.AlignVertEnum.Center;
        dgSchematic.Splits[0].ColumnCaptionHeight = 28;
        dgComp.Splits[0].ColumnCaptionHeight = 28;
        xmlPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "temp.xml");
        tsMarkup.Location = new Point(355, 0);
        if (Args != null)
            mi.Invoke();
    }

    private void wordSearch_SystemChanged(object sender, EventArgs e)
    {
        //How to get the value of newSystemRec???
        Int32 newSystemRec = 
        newSystemRec--;
        Int32 index = newSystemRec;
        switch (index)
        {
            case 1:
                systemMode = SystemMode.Hydraulic;
                cbSystem.SelectedIndex = 1;
                break;
            case 0:
            default:
                systemMode = SystemMode.Electrical;
                cbSystem.SelectedIndex = 0;
                break;
        }
        if (p2pMode == p2p.Trace)
            tabP2Trace.TabVisible = true;
    }

【问题讨论】:

  • 了解如何实例化表单会有帮助。从那里可以更容易地提供帮助。
  • 我现在看到了 mainForm 的声明位置,但看不到它的实例化和显示位置。
  • 我还应该提到我不太确定我是否理解您的设计。如果mainFormWordSearch 的成员,那么当后者关闭时会发生什么? mainForm 是否应该比包含表单的寿命更长?

标签: c# .net winforms parameter-passing


【解决方案1】:

您的代码没有显示这两个表单是如何实例化的,但基本上您可以做的是将值公开为表单的属性并从其他表单访问它。当然,为了做到这一点,必须有一个上下文,其中两个表单实例都是已知的,以便一个可以访问另一个:

public int NewSystemRec
{
    get
    {
        // return value here
    }
}

【讨论】:

  • 如果您想要求帖子作者进一步澄清,您应该发表评论,而不是答案。
  • @Servy 实际上我至少有一部分答案:将值公开为表单属性。我相信这很有帮助,可以尝试回答。至于最后一段,我现在把它移到 cmets 部分。
  • -我添加了显示我的表单如何一起实例化的部分
  • @Servy 我对所有这些编码都是新手,请不要互相争论,因为这没有用。我试图提供更多信息。
  • @Crono 我对所有这些编码都是新手,请不要互相争论,因为这没有用。我试图提供更多信息
【解决方案2】:

您可以在 WordSearch 上创建一个属性,例如:

private int newSystemRec;

并使用属性访问它:

public int NewSystemRec
{
    get
    {
        this.newSystemRec;
    }
}

示例:

MainForm mainForm = new mainForm()
someControlOnForm1.Text = mainForm.NewSystemRec;

你也可以使用构造函数:

public MainForm(int newSystemRecFromWordSearch ) {
 int newSystemRec = id;
}

并在 WordSearch 上使用它

var form = new MainForm(newSystemRec);

希望对你有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多