在最近的学习中涉及到了数据的获取问题,主要问题是子窗体获取父窗体。
先上效果图
这里是连接了Oracle数据库获得的数据
因为接触C#的时间不长,最开始对如何获取父窗体的数据毫无头绪,尝试直接在子窗体调用父窗体的函数,遗憾的报错了。
后来发现调用的父窗体未设置为静态。只有静态的对象才能直接获取控件的数据。
首先静态化父窗体,如果不静态化,动态的窗体只能先实例化,才能被外部访问。实例化new操作相当于创建了新的实例,也就是你获取到的都是新实例的属性而不是原来的(你想得到的)控件的属性。
非静态的成员每个实例都是独立的对象,互不影响,有各自独立的地址。而静态成员的内存地址固定共享。静态成员的属性更改,所有实例都会受到影响。static成员的值,可以被所有其他实例共同使用。
N个实例,如果改变静态的实例,那么N个实例都会因为这个改变产生变动,而动态的只会改变自身。
这就是将父窗体静态化后,可以得到父窗体内控件的属性值的原因,因为他的值是确定的且针对所有。
理解了静态化的作用之后代码就不难写了。我们先静态化父窗体并创建静态实例,在子窗体调用即可得到我们想要的属性。
下面是关键代码
父窗体的实例化
public static BookManager bManager;//静态实例化对象
/// <summary>
/// reg代表区域 0为西区1为南区2为东区
/// 父窗体 BookManager类
/// </summary>
public int reg = 0;
public BookManager()
{
InitializeComponent();
bManager = this;//为实例对象赋值
}
父窗体的datagridview(只是表示一个事件)
private void westlib_Click(object sender, EventArgs e)
{
reg = 0;
//string westconn = "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521))(CONNECT_DATA = (SERVICE_NAME = libwest))); Persist Security Info = True; User ID = west1; Password = qwe123789A; ";//以上为一行,显示为三行
// 创建数据集收集数据
DataSet dataSet = new DataSet();
// Oracle连接函数 需要引用Oracle.ManagedDataAccess.DLL
OracleConnection conn = new OracleConnection(westconn);
conn.Open();
//创建SQL命令 和适配器
OracleCommand comm = conn.CreateCommand();
comm.CommandText = "select * from bookwest";
OracleDataAdapter dataAdapter = new OracleDataAdapter();
//找到我们想要的命令 fill填满数据集
dataAdapter.SelectCommand = comm;
dataAdapter.Fill(dataSet);
//在dgview上显示
this.dataGridView1.DataSource = dataSet.Tables[0].DefaultView;
conn.Close();
}
子窗体BookInfoModify调用父窗体数据
private void BookInfoModify_Load_1(object sender, EventArgs e)
{
bidlabel.Text = BookManager.bManager.dataGridView1.Rows[BookManager.bManager.dataGridView1.CurrentRow.Index].Cells[0].Value.ToString();
bnametextbox.Text = BookManager.bManager.dataGridView1.Rows[BookManager.bManager.dataGridView1.CurrentRow.Index].Cells[1].Value.ToString();
bnumTextBox1.Text = BookManager.bManager.dataGridView1.Rows[BookManager.bManager.dataGridView1.CurrentRow.Index].Cells[2].Value.ToString();
}
结果图
希望能对大家学习有所帮助。本人也是初学C#.net,一些表述可能不准,还望各位多多理解。