C#--winform-- 子窗体实现主窗体的刷新

一笑奈何 2011-03-11 02:38:47
我有两窗体,一个列表在下面,一个是添加在上面
我想点击添加窗体的确定键,后面类表里面就显示添加的内容 ,点击确定,后面刷新,下一条再点击,后面刷新,子窗体一直在上面操作,主窗体不断更新
主窗体:
public partial class UserInfoList : Form
{
private DataSet dataSet = new DataSet();
private SqlDataAdapter dataAdapter;
public UserInfoList()
{
InitializeComponent();
}
public void Bind1()
{
FillDgv("SELECT * FROM Info RIGHT OUTER JOIN Result ON Info.客户代码 = Result.KHDM");
dgvInfoList.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
}
public void UserInfoList_Load(object sender, EventArgs e)
{
Bind1();
}
public void FillDgv(string sqlstr)
{
string sql = sqlstr;
dataAdapter = new SqlDataAdapter(sql, DBHelper.connection);
dataAdapter.Fill(dataSet)
dgvInfoList.DataSource = dataSet.Tables[0];
DBHelper.connection.Close();
}
子窗体:
private void btnOK_Click(object sender, EventArgs e)
{
//调用验证输入方法
if (ValidateInput())
{
//打开数据库连接
DBHelper.connection.Open();
//编写插入sql语句
string sql = string.Format("INSERT INTO Result(KHDM ,[TIME] ,RESULT)VALUES ('{0}','{1}','{2}')", this.lblKHMC.Text.Trim(), DateTime.Parse(dtpTime.Text).ToString("yyyy/MM/dd"), cboResult.Text);
SqlCommand command = new SqlCommand(sql, DBHelper.connection);
int result = (int)command.ExecuteNonQuery();
if (result > 0)
{
MessageBox.Show("添加成功!", "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
num++;
this.txtUser.Text = list[num];
this.lblKHMC.Text = listId[num];
UserInfoList a = new UserInfoList();
a.Bind1();/////////////////////////点击确定,显示后面窗体的刷新内容??????????
DBHelper.connection.Close();
}
}
...全文
1374 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq254242213 2011-03-12
  • 打赏
  • 举报
回复
在子窗体定义一个委托,然后父窗体订阅这个委托。然后子窗体刷新方法里面判断委托不为空并执行!
tanktang811010 2011-03-12
  • 打赏
  • 举报
回复
那个你数据库那两个表字段能不改成CustomerNO啊,看着太让人扎心了。
yalan 2011-03-12
  • 打赏
  • 举报
回复
这是最简单效率最高的方法,委托本人测试过,效率不如参数传递高,且参数传递方法更简单。

另外:按照原理来说参数传递和委托效率应该一样,但是实际测试还是有差别。
yalan 2011-03-12
  • 打赏
  • 举报
回复
主窗体:

public void bind()
{
//数据绑定的方法
}

//打开子窗体
private void button1_Click(object sender,eventargs e)
{
Form2 f2=new Form2(this); //将主窗体作为参数传递给子窗体
f2.Show();
}



子窗体:
在子窗体的构造函数中修改代码:
Form1 f1 = new Form1();
public Form2(Form1 frm1)
{
f1= frm1;
InitializeComponent();
}

子窗体中点击上一条下一条时刷新父窗体:
if (result > 0)
{
MessageBox.Show("添加成功!", "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
num++;
this.txtUser.Text = list[num];
this.lblKHMC.Text = listId[num];
UserInfoList a = new UserInfoList();
f1.Bind1();/////点击确定,显示后面窗体的刷新内容
DBHelper.connection.Close();
}
rekym 2011-03-11
  • 打赏
  • 举报
回复
简单点,主窗体在生成添加窗体时把dgvInfoList列表传递过去...

addform addf=new addfrom(dgvInfoList);

这样即可以在添加窗体中直接操作主窗体列表;
cc_net 2011-03-11
  • 打赏
  • 举报
回复
委托哦啊
tmd456 2011-03-11
  • 打赏
  • 举报
回复
委托,回调
gohappy2008 2011-03-11
  • 打赏
  • 举报
回复
将主窗体的实例传递给子窗体。
然后子窗体里调用实现对主窗体的刷新操作。(用到窗体之间传值)
yyang19871226 2011-03-11
  • 打赏
  • 举报
回复
委托 callback
shandengx 2011-03-11
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 tsapi 的回复:]
直接用委托事件就可以了:

首先Bind1方法为无返回类型,那就用无返回类型的delegate
1、子窗体class前定义

public delegate void Callback();
// 后再子窗体中添加如下代码
public event Callback Callevent=null;

//放在btnOK_Click事件中
Callevent()……
[/Quote]

自认为委托是很好的。。
Daqing 2011-03-11
  • 打赏
  • 举报
回复
直接用委托事件就可以了:

首先Bind1方法为无返回类型,那就用无返回类型的delegate
1、子窗体class前定义

public delegate void Callback();
// 后再子窗体中添加如下代码
public event Callback Callevent=null;

//放在btnOK_Click事件中
Callevent();
2.主窗体
调用委托事件
子窗体 chil = new 子窗体();
chil.Show();
chil.Callevent += new Callback(chil_Callevent);

void chil_Callevent()
{
this.Bind1();
}

//OK该方法最合理
coolmurder 2011-03-11
  • 打赏
  • 举报
回复
按你提供的代码 确定后主窗体是不会刷新的。
因为你的a和你的主窗体不是同一个对象。
你需要在子窗体里声明一个主窗体类型的引用。
当你打开子窗体时,要把主窗体的引用传给子窗体。
在你点击确定后取执行这个主窗体引用的Bind1()方法

//主窗体
public partial class UserInfoList : Form
{
private DataSet dataSet = new DataSet();
private SqlDataAdapter dataAdapter;

public void Bind1()
{
//Do bind data.
}
public void UserInfoList_Load(object sender, EventArgs e)
{
Bind1();
}

public void showChild()
{
ChildForm cf = new ChildForm();
cf.m_parent = this;
cf.Show();
}
}
//子窗体:
public class ChildForm : Form
{
public UserInfoList m_parent;
private void btnOK_Click(object sender, EventArgs e)
{

if (result > 0)
{
MessageBox.Show("添加成功!", "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
m_parent.Bind1();/////////////////////////点击确定,这里将刷新主窗体。
}
}

里面没有关系的代码我去掉了,我只是写了个样式没有编译测试。
BTW:以后问问题把代码整理了再贴上来,别整一驼代码扔上来。别人没时间练找茬。
旅行者I号 2011-03-11
  • 打赏
  • 举报
回复
委托,回调
唯美德 2011-03-11
  • 打赏
  • 举报
回复
把主窗体里面dgvInfoList.DataSource的DataTable传到子窗体中。
在子窗体中往数据库中INSERT一条数据的同时,往DataTable中也Add一条数据。
这样主界面就自动会显示最新的数据。
arthur032 2011-03-11
  • 打赏
  • 举报
回复
重新绑定数据
没法下载,到这里折腾一把试试。 本文由abc2253130贡献 doc文档可能在WAP端浏览体验不佳。建议您优先选择TXT,或下载源文件到本机查看。 C#WINFORM)学习 一、 C#基础 基础 类型和变量 类型和变量 类型 C# 支持两种类型:“值类型”和“引用类型”。值类型包括简单类型(如 char、int 和 float 等)、枚举类型和结构类型。引用类型包括类 (Class)类 型、接口类型、委托类型和数组类型。 变量的类型声明 变量的类型声明 每个变量必须预先声明其类型。如 int a; int b = 100; float j = 4.5; string s1; 用 object 可以表示所有的类型。 预定义类型 下表列出了预定义类型,并说明如何使用。 类型 object 说明 所有其他类型的最终 基类型 字符串类型; 字符串是 Unicode 字符序列 8 位有符号整型 16 位有符号整型 32 位有符号整型 64 位有符号整型 示例 object o = null; 范围 string sbyte short int long string s = "hello"; sbyte val = 12; short val = 12; int val = 12; long val1 = 12; -128 到 127 -32,768 到 32,767 -2,147,483,648 2,147,483,647 -9,223,372,036,854,775,808 到 第1页 C#WINFORM)学习 long val2 = 34L; 到 9,223,372,036,854,775,807 byte ushort 8 位无符号整型 16 位无符号整型 byte val1 = 12; ushort val1 = 12; uint val1 = 12; uint 32 位无符号整型 uint val2 = 34U; ulong val1 = 12; ulong val2 = 34U; ulong 64 位无符号整型 ulong val3 = 56L; ulong val4 = 78UL; float 单精度浮点型 float val = 1.23F;7 位 double val1 = 1.23; double 双精度浮点型 double val2 = ±5.0 × 10?324 ±1.7 × 10 308 0 到 255 0 到 65,535 0 到 4,294,967,295 0 到 18,446,744,073,709,551,615 ±1.5 × 10?45 ±3.4 × 10 38 到 到 4.56D;15-16 布尔型;bool 值或为 真或为假 字符类型;char 值是 一个 Unicode 字符 精确的小数类型, 具有 28 个有效数字 bool val1 = true; bool val2 = false; char val = 'h'; decimal val = bool char decimal DateTime ±1.0 × 10?28 ±7.9 × 10 28 到 1.23M;28-29 变量转换 简单转换: float f = 100.1234f; 可以用括号转换: short s = (short)f 也可以利用 Convert 方法来转换: string s1; s1=Convert.ToString(a); MessageBox.Show(s1); 常用 Convert 方法有: 第2页 C#WINFORM)学习 C# Convert.ToBoolean Convert.ToByte Convert.ToChar Convert.ToDateTime Convert.ToDecimal Convert.ToDouble Convert.ToInt16 Convert.ToInt32 Convert.ToInt64 Convert.ToSByte Convert.ToSingle Convert.ToString Convert.ToUInt16 Convert.ToUInt32 Convert.ToUInt64 备注 Math 类 常用科学计算方法: C# Math.Abs Math.Sqrt Math.Ro

110,552

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧