问题阐述
在进销存管理系统中添加销售单信息时,每个销售单都可能对应多种商品,而且在向销售单中添加商品时,一般都是在新弹出的窗体中选择商品,这时就涉及到通过子窗体刷新父窗体的问题,如何来解决这个问题呢?
专家解答
实现通过子窗体刷新父窗体功能时,主要通过在自定义事件中执行数据绑定来对主窗体进行刷新,即当子窗体产生更新操作时,通过子窗体的一个方法,触发主窗体中对应的处理事件,这个过程中,主要用到了EventHandler事件,下面对该事件进行介绍。
EventHandler事件主要是通过EventHandler委托来实现的,该委托表示将处理不包含事件数据的事件的方法,其语法格式如下:
[SerializableAttribute]
[ComVisibleAttribute(true)]
public delegate voidEventHandler(Object sender,EventArgs e)
说明:参数sender表示事件源。参数e表示不包含任何事件数据的EventArgs事件数据。
下面通过一个实例讲解,如何使用C#实现通过子窗体刷新父窗体的功能。
(1)新建一个Windows窗体应用程序,命名为RefreshFormByChildForm。
(2)更改默认窗体Form1的Name属性为Frm_Main,在该窗体中添加一个MenuStrip控件,用来作为窗体的菜单栏;添加一个DataGridView控件,用来显示数据库中的数据。
(3)在该项目中添加一个新的Windows窗体,命名为Frm_Child.cs,该窗体中添加4个TextBox控件,分别用来输入编号、姓名、电话和地址;添加一个ComboBox控件,用来选择要删除的编号;添加3个Button控件,分别用来执行添加信息、清空文本和删除信息操作。
(4)实现通过子窗体刷新父窗体功能的主要代码如下:
voidBabyWindow_UpdateDataGridView(object sender,EventArgs e)
{
if(Frm_Child.GlobalFlag == false) //当单击删除按钮时
{
if(ConnPubs.State ==ConnectionState.Closed) //当数据库处于断开状态时
{
ConnPubs.Open(); //打开数据库的连接
}
//定义一个删除数据的字符串
string AfreshString = "deletetb_User where userID=" + Frm_Child.DeleteID.Trim();
PersonalInformation = newSqlCommand(AfreshString,ConnPubs); //执行删除数据库字段
PersonalInformation.ExecuteNonQuery(); //执行SQL语句
ConnPubs.Close(); //关闭数据库
DisplayData(); //显示数据库更新后的内容
MessageBox.Show("数据删除成功!","提示信息",MessageBoxButtons.OK,MessageBoxIcon.Asterisk);
}
else
{
if(ConnPubs.State == ConnectionState.Closed) //当数据库处于关闭状态时
{
ConnPubs.Open(); //打开数据库
}
string InsertString = "insert intotb_User values('" + Frm_Child.idContent + "','" +Frm_Child.nameContent + "','" + Frm_Child.phoneContent + "','"+ Frm_Child.addressContent + "')"; //定义插入数据的字符串变量
PersonalInformation = newSqlCommand(InsertString,ConnPubs); //执行插入数据库字段
PersonalInformation.ExecuteNonQuery(); //执行SQL语句
ConnPubs.Close(); //关闭数据库
DisplayData(); //显示更新后的数据
MessageBox.Show("数据添加成功!","提示信息",MessageBoxButtons.OK,MessageBoxIcon.Asterisk);
}
}
程序运行效果如图8.9所示。
图8.9 通过子窗体刷新父窗体
专家点评
通过子窗体刷新父窗体是开发项目时经常用到的一种技术,而上面所讲解的通过自定义事件的方式解决该问题是一种很有新意的解决方法,希望读者能够熟练掌握这种方法,并能够将其应用于实际项目开发中。
领取专属 10元无门槛券
私享最新 技术干货