窗体之间回调参数,有思路,却实现不了

wuda8 2006-10-26 01:17:23
我想实现单击窗体A中dataGridView的某个单元格后,弹出窗体B
在窗体B中选中的值赋值给窗体A中dataGridView中刚刚选定的单元格,不知道该怎样解决,求各位大侠详细解释
已经困扰两天了,用了很多方法,但是最终都未实现自己想要的方法.分不够可以再加,解决问题是最重要的
...全文
725 39 打赏 收藏 转发到动态 举报
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
喝醉的咖啡 2006-10-30
  • 打赏
  • 举报
回复
sigh
代码都贴出来了,自己在程序中试验一下就知道了啊

为了兼顾你说的 DataGridView,我连例子都是用 .NET 2.0 写的,不会试试看啊
duke1111 2006-10-27
  • 打赏
  • 举报
回复
mark,回头按方法自己做一下。
flowersea312 2006-10-27
  • 打赏
  • 举报
回复
晕了,顶
wuda8 2006-10-27
  • 打赏
  • 举报
回复
说实话,我都不好意思再问了,大家边样子帮助我,可是我还是不能完全理解,主要是自己水平太菜.
++++++++++++++++
A调用B的这个方法时,是同步调用的。B的方法执行完成,A获得结果并继续执行,如果要对A的界面元素进行改动,这个时候就可以做啊。
++++++++++++++
有没有简短的代码看看
aafshzj 2006-10-27
  • 打赏
  • 举报
回复
A调用B的这个方法时,是同步调用的。B的方法执行完成,A获得结果并继续执行,如果要对A的界面元素进行改动,这个时候就可以做啊。
wuda8 2006-10-27
  • 打赏
  • 举报
回复
那么如何关闭模式窗口时自动刷新A窗口?
asdex1999 2006-10-27
  • 打赏
  • 举报
回复
楼主,我也在写和你一样的程序,我的思想是根据当前选 中的B的内容生成个temptable,再写入A内,不过我也还没有实现,有时候加QQ:19644753讨论一下、。
asdex1999 2006-10-27
  • 打赏
  • 举报
回复
http://blog.csdn.net/yumanqing/archive/2006/10/23/1346272.aspx
aafshzj 2006-10-26
  • 打赏
  • 举报
回复
窗体定义一个方法。你通过方法传参数进去并以模式窗口方式打开窗口,设置完的数据再通过参数传回来就可以了,必要时可以使用ref/out参数。

这你应该可以理解,实现起来最万能也最简单。
wuda8 2006-10-26
  • 打赏
  • 举报
回复
晕了,上面的朋友,说实话,我是菜鸟,你们所说的,我很多都看不懂,不过让我知道自己的不足之处是真的,我想我的这个问题,也只有自己努力攻破了.
Love_My 2006-10-26
  • 打赏
  • 举报
回复
方法还是很多的...
喝醉的咖啡 2006-10-26
  • 打赏
  • 举报
回复
>如果数据写入数据库的话,在form.show事件里,重新绑定dataGridView的datasource,应该可以完成更新吧

不需要刷新 dataGridView,因为DataSource与你的数据载体,例如 IList 或者 DataSet 等是不同的引用引用了相同的内存,修改了 IList/DataSet或者dataGridView 任何一个中的数据,全都变了

>aafshzj(上海北京)
呵呵,ref/out 没什么不好,只是补充说了一下如果不注意细节,使用 ref 可能会变成:引用的引用,好比指针的指针是同样的道理。
但如果知道细节的区别,那就可以灵活运用,比如实现交换两个变量(的数据)。
aafshzj 2006-10-26
  • 打赏
  • 举报
回复
回调在上下文能够很容易打包(比如本来就是一个对象)的时候是可用的。

用窗口方法更简单直观,而且节约,呵呵。


小猪啊,你把这里变猪圈了,呵呵,一进来看着这么多就晕。

immutable对方法调用的方式没多大影响的,顶多加个ref罢了。恰恰是构造器方式反而对此有点敏感。
wuluhua2003 2006-10-26
  • 打赏
  • 举报
回复
如果数据写入数据库的话,在form.show事件里,重新绑定dataGridView的datasource,应该可以完成更新吧
喝醉的咖啡 2006-10-26
  • 打赏
  • 举报
回复
那就看代码吧
===============================
弹出窗体代码:
public partial class Form2 : Form
{
DataGridView _dataGridView;
private Form2()
{
InitializeComponent();
}
public Form2(DataGridView dataGridView)
: this()
{
_dataGridView = dataGridView;
}
private void button1_Click(object sender, EventArgs e)
{
_dataGridView.CurrentCell.Value = "test";
}
}
===============================
调用者:
private void button1_Click(object sender, EventArgs e)
{
Form2 form = new Form2(dataGridView1);
form.Owner = this;
form.Show();
//form.ShowDialog();
}

喝醉的咖啡 2006-10-26
  • 打赏
  • 举报
回复
〉而 .NET/C# 中,结构体都是不可变类,而其它大部分都是可变类(你自己也可以把自己的类变成不可变类 immutable class)

发完了发现自己这句话有错:结构体无所谓是不是不可变类,而是结构体是传值方式,非结构体是传引用(地址)方式——因为前者在堆栈后者在堆中。

灵活运用不可变类和可变类,加上认真区分结构和类,在使用 ref/out 时格外小心即可做到灵活运用而不犯错误,呵呵
喝醉的咖啡 2006-10-26
  • 打赏
  • 举报
回复
我等老妖精好久没来 csdn(一年也就一两次),难得有些兴奋,借楼主宝地跑跑题

会 java 的朋友不妨深入考虑一下,传递引用过去就能解决本问题,那么是不是所有“对象”的引用都可以呢?

这里面涉及到一个“不可变类”的概念。
什么是不可变类?比如在本例中如果传递一个 DataTime 类型的对象过去,被调用者调用 DateTime 的 Add() 等方法更改其值,结果无效,DataTime 就是“不可变类”。
为了避免一些常见的错误,以及内存操作方面的问题,String 其实也是不可变类——比如
string name = "play";
name += "@xiaozhu.com";
其实,在内存中实际上是重新分配了一块内存空间给新的 string,然后把 name 的引用从指向原来的内存空间指向到了新的内存空间——也就是说,原来的 string 内容并没有改变(这一点学过C 的 strcat 就知道了),这其实是一种保护

在 java 中,因为没有结构的概念,所有对象都是在 堆 上分配空间,而在 C# 中,还有结构体,它们在堆栈中分配空间。所以,java 中哪一个类是不可变类,哪一个是,很难确定
而 .NET/C# 中,结构体都是不可变类,而其它大部分都是可变类(你自己也可以把自己的类变成不可变类 immutable class)

那么,灵活运用 可变类 与 不可变类,灵活应用 引用,ref 和 out 在大多数情况下用不上的——因而,可以避免一些场合因为错误使用 ref/out 导致的错误:例如资源泄漏和修改了对象本身。反之,明确了这一区别,可以更好地用好 ref/out,实现一些巧妙操作,呵呵

wuda8 2006-10-26
  • 打赏
  • 举报
回复
谢谢大家引导,看了上述大家对该贴子的评论,我已经发现自己不足之处,不过现在的我水平是很菜,但是我一直在努力,也希望大家以后也经常帮助我,不过这个问题还是没有解决,不知道该怎样解决,还请大虾帮忙
喝醉的咖啡 2006-10-26
  • 打赏
  • 举报
回复
带团队和教学生的时候我经常让他们做一个练习:编写记事本

其中就会涉及到查找操作——弹出的对话框中查找到了符合条件的内容,需要让父窗体的 TextBox 也选中并自动滚动到查找到的内容

呵呵,这里面考察的并不是对 delegate/event 的应用,实际上是基础知识掌握的程度:引用和构造函数

可见,对于同一问题有很多种不同的解决方案,关键不在于你会多少种,而在于你能否采用恰当的那一种

这样,扎实掌握好基础知识就很重要了——对于系统设计,尤其是架构设计而言尤为重要。
喝醉的咖啡 2006-10-26
  • 打赏
  • 举报
回复
在本例中,基础知识扎实一些:对象的引用、模式窗体、构造函数 就能解决问题,不需要 delegate 和 event

至于回调——在 c/c++ 时代,所谓回调是一个函数指针,传递函数指针给被调用者,被调用者通过该函数指针调用调用者提供的方法,是为 call back, Win32 API 中大量的需要使用回调

OO 时代的回调:java/c# 等没有了指针,如何实现回调?前者因为没有 delegate 的概念,因此不得不将一个类的实例(的引用)传递给被调用者,被调用者可以通过该引用访问该类的某个特定的方法。而为了确保该方法有效,oo 方式下,可以借助 interface 来加强约束,而 C/C++ 的函数指针无法约束之(函数指针直接访问内存,因此无法约束,这也是问题所在)。很明显,“回调”无非是一个概念/模式。
.NET 提供了 delegate 的概念,我们可以这样来理解 delegate:方法级别的 interface,或者 面向对象的函数指针 —— delegate 封装了“函数指针”,又把约束从 interface 级别降低到方法级别,这样就容易理解了。也就是说,在 .NET 实现回调的模式和机制,用 delegate 很简单。
可在本例中,传递一个引用过去即可,因为无论是你的 datagrid 还是你从 datagrid 获得的 datarow 都已经带有了你需要的东西,而传递它们的引用足矣——类似 java 的实现方式,原因并主要是没必要另外定一个 delegate 甚至 interface 来约束,datagrid 或 datarow 或其它已经约束了。

说到这里,已经解释得够清楚,各位不用计较究竟是传递一个 DataRow 还是什么了吧?呵呵

继续深入看看:

如果在主窗体写了一个方法,同时定义一个 delegate,然后通过种种方式(包括构造器或者其它方法)传递给弹出窗体,弹出窗体在适当的时候 invoke 这个 delegate —— 也没问题,无非是把这个“回调”过程显式了而已——所以我说如果牢牢记的传递的 DataGrid 等本身是引用,那就不必如此麻烦了,因为通过传递过来的 DataGrid 等(anything else)的引用,我们能够明确知道它的类型、方法和属性(它的定义本身已经明确了),所以本例不必 delegate 就能解决问题

那么如果更进一步,把 delegate 上升到 event 又如何呢?
其实 event 和 delegate 本质上没有不同,你可以把 event 看作是 delegate 的一个特殊的“广播”数组。
上面说过 delegate 是对 函数指针 的包装——对象化的函数指针——它会验证并确保函数的原型(签名 sign)正确,又能确保避免指针操作(对指针的值——地址本身的操作),那么 event 无非是一个 observer 模式的实现:观察者数组
当被观察的主题 subject 发生了变化——比如调用 delegate 的时机到了,换成 event 无非是从 invoke 一个 delegate 引用的函数变成了 引用多个 delegate 引用的函数:广播版本的 delegate

可见,本例没必要使用 delegate 和 event
aafshzj(上海北京) ,用不上 ref/out,我不是抬杠。如果没有 dataRow,那同样的思路和思维模式即可,换成什么都无所谓。

至于提到模式窗体,是估计有人会提到“刷新”或者紧接着做一些其他事情。

加载更多回复(19)

110,825

社区成员

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

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

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