如何将值从子表单传递给父表单并返回?

时间:2011-11-12 10:51:15

标签: c# .net winforms

我有一个父表单first.cs喜欢这个

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

并在此子窗体中使用此值,然后将其传递给父窗体first.cs

我该怎么做?

3 个答案:

答案 0 :(得分:4)

为子表单定义Property

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

现在您可以访问此任意内容并在显示表单之前为其分配数据

答案 1 :(得分:3)

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

<强>参考

将成员变量添加到类型为first

的addTriple类中

e.g。

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

<强>属性

向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.

答案 2 :(得分:0)

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

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

            }

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