如何将值从子窗体传递到父窗体并返回

本文关键字:窗体 返回 | 更新日期: 2023-09-27 18:14:25

我有一个父表单firstcs,像这样

public partial class first : Form
{
    public Graph graphi { get; }
    Graph g = new Graph();
    string s1 = null;
    private void button1_Click(object sender, EventArgs e)
    {
        Stream myStream = null;
        var parser = new Notation3Parser();
        var graph = new Graph();
        OpenFileDialog openFileDialog1 = new OpenFileDialog();
        openFileDialog1.Filter = "RDF files (*.n3)|*.n3";
        openFileDialog1.FilterIndex = 1;
        openFileDialog1.RestoreDirectory = true;
        openFileDialog1.Multiselect = false;
        if (openFileDialog1.ShowDialog() == DialogResult.OK)
        {
            try
            {
                if ((myStream = openFileDialog1.OpenFile()) != null)
                {
                    using (myStream)
                    {
                        string s = openFileDialog1.FileName.ToString();
                        string w = Directory.GetCurrentDirectory().ToString();
                        string Fname = openFileDialog1.SafeFileName.ToString();
                        File.Copy(s, Path.Combine(w, Fname), true);
                        // Insert code to read the stream here.
                        Win32.AllocConsole();
                        s1 = Path.Combine(w, Fname);
                        showPath.Text = s1;
                        String parentvalueadress = this.s1;
                        showPath.Visible = true;
                        insertNodeButton.Visible = true;
                        delBut.Visible = true;

                        showNodes showNodes1 = new showNodes(s1);
                        g = showNodes1.returngraph();

                        Console.Read();
                        Win32.FreeConsole();

                        this.Show();
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message);
            }
        }
    }
    private void insertNodeButton_Click(object sender, EventArgs e)
    {
        addTriple a1 = new addTriple();
        a1.BringToFront();
        a1.ShowDialog();
        g.SaveToFile(this.s1);
    }
    private void button3_Click(object sender, EventArgs e)
    {
        delete a1 = new delete();
        a1.BringToFront();
        a1.ShowDialog();
    }
}

在insertNodeButton_Click方法中,我想传递一个图形g的值给子窗体,它的代码是这样的:

public partial class addTriple : Form
{
    Graph gr;
    String childvalueadress;
    private void addTriple_Load(object sender, EventArgs e)
    {
        var parser = new Notation3Parser();
        var graph = new Graph();    
        gr = graph;
        parser.Load(graph, childvalueadress);    
    }
    private void subComboBox_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (subComboBox.SelectedItem.ToString() == "URI")
        {
            subUriTB.Visible = true;
            label1.Visible = true;
        }
        else
        {
            subUriTB.Visible = false;
            label1.Visible = false;
        }
    }
    private void objComboBox_SelectedIndexChanged(object sender, EventArgs e)
    {
        if ((objComboBox.SelectedItem.ToString() == "URI") || (objComboBox.SelectedItem.ToString() == "Literal"))
        {
            objUriTB.Visible = true;
            label1.Visible = true;
        }
        else
        {
            objUriTB.Visible = false;
            label1.Visible = false;
        }
    }
    private void addTripleButton_Click(object sender, EventArgs e)
    {
        if (subComboBox.Text.ToString() == "select" || objComboBox.Text.ToString() == "select")
            MessageBox.Show("please select node types");
        else if ((subComboBox.SelectedItem.ToString() == "URI") && (subUriTB.Text.ToString() == ""))
            MessageBox.Show("please fill text box for URI");
        else if ((preUriTB.Text.ToString() == ""))
            MessageBox.Show("please fill text box for URI");
        else if ((objUriTB.Text.ToString() == "") && ((objComboBox.SelectedItem.ToString() == "URI") || (objComboBox.SelectedItem.ToString() == "Literal")))
            MessageBox.Show("please fill text box for object name");
        else if ((objComboBox.SelectedItem.ToString() == "URI") && (objUriTB.Text.ToString() == ""))
            MessageBox.Show("please fill text box for URI");
        try
        {
            if ((subComboBox.Text.ToString() == "URI") && (objComboBox.Text.ToString() == "URI"))
                addUUU(subUriTB.Text.ToString(), preUriTB.Text.ToString(), objUriTB.Text.ToString(), gr);
            else if ((subComboBox.Text.ToString() == "URI") && (objComboBox.Text.ToString() == "Literal"))
                addUUL(subUriTB.Text.ToString(), preUriTB.Text.ToString(), objUriTB.Text.ToString(), gr);
            else if ((subComboBox.Text.ToString() == "Blank") && (objComboBox.Text.ToString() == "Literal"))
                addBUL(preUriTB.Text.ToString(), objUriTB.Text.ToString(), gr);
            else if ((subComboBox.Text.ToString() == "URI") && (objComboBox.Text.ToString() == "Blank"))
                addUUB(subUriTB.Text.ToString(), preUriTB.Text.ToString(), gr);
        }
        catch
        {
            MessageBox.Show("please correct the uri");
        }
        gr.SaveToFile("c:''n.n3");
    }
}

并在子表单中使用此值,然后首先将其传递给父表单。cs

我该怎么做呢?

如何将值从子窗体传递到父窗体并返回

为子窗体定义属性

// In Parent Form
addTriple a1 = new addTriple();
a1.G = graphicdata //assign graphic data here
a1.BringToFront();
a1.ShowDialog();
g.SaveToFile(this.s1);

// In Child Form
public Graph  G
{
    get { return gr; }
    set { gr = value; }
}

现在你可以在任何地方访问它并在显示表单

之前为它分配数据

有两种可能的方法。一种是在子表单中保存对父表单的引用。另一种方法是为子窗体添加属性。

参考

为addTriple类添加first类型的成员变量

first _parent;

将addTriple表单上的构造函数更改为如下

    public addTriple(first p, Graph g)
    {
        _parent = p;
        this.Graph = g; //now you have a reference to the graph from the original form.
    }

显示新表单时,使用以下代码:

addTriple a1 = new addTriple(this, g); //g being the graph you wish to use in the modal form.
a1.BringToFront();
a1.ShowDialog();
<<p> 属性/strong>

为addTriple类添加一个属性

public Graph Graph {get;set;}

然后使用下面的

显示表单
addTriple a1 = new addTriple(); //create a new instance of the form
a1.Graph = this.Graph; //set the graph to the one from the parent form
a1.ShowDialog(); //show the form as a dialog
this.Graph = a1.Graph; // once the form is closed get the changed graph back to the parent.

////为addTriple表单创建一个这样的构造函数,并传递Graph对象作为引用

  public addTriple(ref Graph g)
        {
            InitializeComponent();
//can access g here ......
        }

然后像这样从主表单

调用它
    private void insertNodeButton_Click(object sender, EventArgs e)
            {
                addTriple a1 = new addTriple(ref g);
                a1.BringToFront();
                a1.ShowDialog();
               //New g will be available here
                g.SaveToFile(this.s1);
            }

不知道这是不是最好的方法