如何将值从子窗体传递到父窗体并返回
本文关键字:窗体 返回 | 更新日期: 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);
}
不知道这是不是最好的方法