没有合适的资源?快使用搜索试试~ 我知道了~
文章内容包括: windows form (窗体) 之间传值小结 ; WCF传输大数据的三种解决方案:WCF传输大数据量DataSet ,在WCF中分页传输数据(Duplex方式),序列化传输; WCF消息回调与心跳包的解决方案
资源推荐
资源详情
资源评论
C#编程实践中问题与解决方案总结
windows form (窗体) 之间传值小结
在 windows form 之间传值,我总结了有四个方法:全局变量、属性、窗体构造函数和
delegate。
第一个全局变量:
这个最简单,只要把变量描述成 static 就可以了,在 form2 中直接引用 form1 的变量,代码
如下:
在 form1 中定义一个 static 变量 public static int i= 9 ;
Form2 中的钮扣按钮如下:
private void button1_Click(object sender, System.EventArgs e)
{
textBox1.Text = Form1.i.ToString();
}
第二个方法是利用属性
这也许是个老话题了,但是今天我在用 property 时却有了新的发现。那就是如果传递的是
类 的 话 , 那 么 是 按 地 址 ( 引 用 ) 来 传 递 的 。 例 如 如 下 两 个 程 序 。 假 设 有 两 个
form,form1、form2 和一个 Class1.cs 的类文件。form1 是程序的开始窗体,通过 form1 来
调用 form2 。程序如下:
Class1.cs 文件的内容是
public class Class1
{
public int i;
public Class1()
{
// TODO:
i = 9;
}
public void modify( int u )
{
i = u;
}
}
Form1 中的内容是
private Class1 ttt;
private void Form1_Load(object sender, System.EventArgs e)
{
ttt = new Class1();
Form2 temp = new Form2();
temp.Change = ttt;
temp.Show();
}
private void button1_Click(object sender, System.EventArgs e)
{
textBox1.Text = ttt.i.ToString();
}
private void button2_Click(object sender, System.EventArgs e)
{
ttt.modify( 44);
}
form2 中的内容是:
private Class1 change;
public Class1 Change
{
get { return change ;}
set
{
change= value;
}
}
private void button1_Click(object sender, System.EventArgs e)
{
textBox1.Text = change.i.ToString();
}
private void button2_Click(object sender, System.EventArgs e)
{
change.modify( 98 );
}
运行程序你会发现,改 form1 中的 textbox 值,那么 form2 中 change 中的 i 的值也会相应的
变,同样 form2 中 change 的 i 值变了,那么 form1 中的 ttt 中的 i 也相应的变了。就好像两
个 form 在使用同一个数据变量一样,为什么呢?
经过思考,其实很简单,原因就在于我们在使用 property 传递数据时使用了同一块内存空
间。
在传递 class 类型的数据时(如上),由于我们没有 new 一个新的实例,而是直接赋值,所
以就相当于使用了引用,把上面的赋值过程改成下面这样,
private Class1 change;
public Class1 Change
{
get { return change ;}
set
{
change = new Class1();
change.i = value.i ;
}
}
那么两个 form 中的值相互之间就不再有什么关联了,也就是说,改其中一个,不会影响另
外一个。这也给了我们一个启示,当我们想在 form 之间传值时,而且还想让值之间有一定
的联系,那么就把这些值用 class 来包起来,再传。这样又清楚又省事。
如果你传的不是类而是一般数据(int , string )等,那么这些数据在 form 之间是没有联系的,
因为 C#在定义这些数据类型时,就默认 new 了他们,例如:int i ; 和 int i = new int() ; 是一
样的,所以我以前经常在 form 之间传递简单的变量时,没有发现数据之间的关系,直到今
天传 class 时才发现。像下面这样的 class :
class temp
{
int i ;
int[] mm;
public temp ()
{ mm = new int [10] ; }
}
在 form 之间传递时,变量 i 是两个窗体共用的,但是 mm 却不是,其原因就是我上面讲
的那样,所以利用 property 的这个特性,我们可以灵活的在 form 之间传递我们想变和不想
变的值。
第三个方法是用构造函数:
Form1 的 button 按钮这样写:
private void button1_Click(object sender, System.EventArgs e)
{
Form2 temp = new Form2( 9 );
temp.Show();
}
Form2 的构造函数这样写:
public Form2( int i )
{
InitializeComponent();
textBox1.Text = i.ToString();
}
第四个方法是用 delegate,代码如下:
Form2 中先定义一个 delegate
public delegate void returnvalue( int i );
public returnvalue ReturnValue;
form2 中的 button 按钮代码如下:
private void button1_Click(object sender, System.EventArgs e)
{
if ( ReturnValue != null )
ReturnValue( 8 );
}
Form1 中的 button 按键如下:
private void button1_Click(object sender, System.EventArgs e)
{
Form2 temp = new Form2( );
temp.ReturnValue = new temp.Form2.returnvalue( showvalue );
temp.Show();
}
private void showvalue( int i )
{
textBox1.Text = i.ToString();
}
点击 form2 的 button,form1 中的 textbox 中的值就会相应变化。
在这四个方法中,
第一个是双向传值,也就是说,form1 和 form2 改变 i 的值,另一方也会受到影响。
第二个方法可以单向也可以双向传值。
第三个方法是 form1->form2 单向传值。
第四个方法是 form2->form1 单向传值。
以后有新的方法我再补充,还有一个就是用 event,和 delegate 差不多,在这里就不说了。
Byte[]转换为 string
C#代码 Byte[]tmpByte;
1. foreach(bytebintmpByte)
2. {
3. etxt+=string.Format("{0:x2}",b);
4. }
WCF 传输大数据的一个解决方案
随笔文章评论
WCF
传输大数据量
DataSet
这几天看了 相关的资料然后就产生一个想法如何实现 实现传输 这个服务的主要
功能是客户端调用服务端的一个函数这个函数接受一个 的参数然后再返回一个 当然
这个功能很简单几行代码就搞定了可是当如果 内的数据量非常大的时候那就麻烦了暂不讨论
传输大数据量的 是否合理 默认最大传输数据量为 当然可以实现修改配置文件来传输
大数据量可是不能解决本质的问题我目前解决这个问题的方式是把一个 序列化为一个字节然
后把这些字节进行压缩然后每次发送一小段字节回去接受到这个些字节以后然后在解压缩再反序列化为
剩余45页未读,继续阅读
资源评论
- huanglb2012-11-07仔细阅卷了,基本还行,谢谢!
chgq0307
- 粉丝: 45
- 资源: 14
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功