一、 SelectedIndexChanged事件, SelectedValueChanged事件和SelectionChangeCommitted事件的区别及应用
在设定datasource和displaymember和valuemember时,以及手动改变combobox索引和值时都不触发该事件, 只是在界面选择combobox不同值时触发
SelectedIndexChanged事件 索引改变时触发
SelectedValueChanged事件 值改变时触发
设置DataSource, DisplayMember, ValueMember不同顺序触发SelectedIndexChanged事件和SelectedValueChanged事件的次数
1. 顺序一
this.comboBox1.DisplayMember = “userName”; (不触发)
this.comboBox1.ValueMember = “userAge”; (只触发SelectedValueChanged)
this.comboBox1.DataSource = dt; (都触发)
SelectedValueChanged触发两次(总是先触发)SelectedIndexChanged,触发一次 (设置DisplayMember属性时不触发两种事件)
2. 顺序二
this.comboBox1.ValueMember = “userAge”;
this.comboBox1.DisplayMember = “userName”;
this.comboBox1.DataSource = dt;
同上
3. 顺序三
this.comboBox1.DataSource = dt; (都触发)
this.comboBox1.DisplayMember = “userName”;(都触发)
this.comboBox1.ValueMember = “userAge”;(只触发SelectedValueChanged事件)
SelectedValueChanged触发三次(总是先触发)SelectedIndexChanged,触发两次 (设置DisplayMember属性时不触发两种事件)
4. 顺序四
this.comboBox1.DataSource = dt; (都触发)
this.comboBox1.ValueMember = “userAge”;(都触发) 其中SelectedValueChanged触发两次
this.comboBox1.DisplayMember = “userName”;(都触发)
SelectedValueChanged触发四次(总是先触发)SelectedIndexChanged,触发三次 (设置DisplayMember属性时不触发两种事件)
三、 线程与控件如何交互?
声明了一个线程:
private Thread CTrlThread;
声明一个委托:
Delegate void DelegateCTrlThr();
声明了一个方法:
private void CTrlThr() { this.listBox1.Items.Add(“AAAAA”); }
封装方法:
DelegateCTrlTr objDelegateCTrlTr = new DelegateCTrlTr (CTrlThr);
用INVOKE方法 调用委托:
private void ThreadMethod()
{
this.INVOKE(objDelegateCTrlTr );
}
在按钮事件中启动线程 注意线程封装的方法是用ThreadMethod()方法:
private void button4_Click(object sender, EventArgs e)
{
CTrlThread = new Thread(new System.Threading.ThreadStart(ThreadMethod));
this.CTrlThread.Start();
}
四、 SilverLigth连接WCF
WCF默认是”wsHttpBinding”,但SL支持且只支持 “basicHttpBinding” 绑定。
五、 IIS安装
如果安装过.NET框架而IIS里没有出现ASP.net选项,先用"aspnet_regiis.exe -i"注册,否则安装.NET框架(dotnetfx2.exe)支持
六、 .NET调试
在”调试”模式中可以看到wsdl文件,皆因web.config中开启了暴露元数据,因此在开发时必须保证此节点为true,部署应用时为false,否则部署也可随意查看服务接口方法,对安全会带来隐患。
七、 SilverLight跨域问题
SL调用WCF,可以看作是不同网域、不同平台、不同语言的A站点与B站点不同异构平台的webservice应用,是跨域的web操作,而默认中的iis服务器,基于安全不允许这样随意跨域访问,因此需要在web站点根目录中增加相应的配置文件 crossdomain.xml、clientaccesspolicy.xml 进行设置。
如WCF服务程序URL为:http://localhost:2368/Service1.svc ,则上述2个文件需要放置在 http://localhost:2368/ 映射的相应目录下。
(1):crossdomain.xml
<?xml version=”1.0″ encoding=”utf-8″ ?>
<cross-domain-policy>
<allow-access-from domain=”*” />
<!– 意为:允许来自任意域名对本web服务站点的任意跨域访问,如要限制跨域访问站点:可将”*”更改为相应域名,多个域名则为多个<allow-access-from … />节点 –>
</cross-domain-policy>
(2):clientaccesspolicy.xml
<?xml version=”1.0″ encoding=”utf-8″?>
<access-policy>
<cross-domain-access>
<policy>
<allow-from http-request-headers=”*”>
<domain uri=”*”/>
</allow-from>
<grant-to>
<resource path=”/” include-subpaths=”true”/>
</grant-to>
</policy>
</cross-domain-access>
</access-policy>
八、 如何获取程序自身执行的路径?
AppDomain.CurrentDomain.BaseDirectory或者Application.StartupPath。不过要注意末尾是否有斜杠。
Application.ExecutablePath属性包含可执行程序本身的文件名。
另外,不要用Environment.CurrentDirectory来获取,这个属性是可以修改的。
九、 如何进行类型转换?
在系统类型中一般都会有Parse方法,比如int.Parse,即Int32.Parse。此外,还可以使用Convert.ToXXX系列方法。对于普通类的转换,可以用强制转换或者as操作符转换。
系统类型的TryParse方法(.net 2.0+)还可以帮助捕获转换异常,并通过返回值告知是否转换成功。数组类型的转换需要注意,int[]与long[]不可以直接使用类似long[] a = (long[])b;这样进行转换,如果没有特殊办法,只能通过循环遍历对数组元素进行对位转换。
十、 如何启动外部程序?
System.Diagnostics.Process.Start(…);就是最基本的调用方法。
十一、 执行大量操作界面会卡死?
UI(界面线程)用于维护界面保持响应,如果在UI线程中出现耗时繁重任务,自然导致该线程无暇响应用户操作。
解决方法:
1、如果是采用VB6的模式,那么在繁重的代码段中添加Application.DoEvents();即可。
2、不过,强烈建议不要在UI线程中进行大量的非界面操作,进行这类操作时最好新建一个线程,需要操纵界面元素的时候再利用委托的Invoke/BeginInvoke回调。
十二、 如何暂停线程?
Thread.Sleep(…)或Thread实例.Join(…)甚至Thread实例.Suspend()(不推荐)等等。
System.Threading.Thread.Sleep(x);
x是毫秒数
Sleep这个函数的作用是阻塞当前线程一定时间。所以这个函数也能用在子线程的过程中。
十三、 Silverlight中.Net与Javascript事件绑定
1、在XAML的控件标记中添加属性制定,以属性=”事件的执行名称”。
<canvas onLeftButtonDown=”leftButtonDown”></canvas>
2、使用JavaScript的指定。
_silverlight_control.content.findName(“controlName”).addEventListener(“onLeftButtonDown”,functionName);
3、使用MSIL的DLL中绑定(只限于Silverlight1.1以上版本)。。
silverlight_control.MouseLeftButtonDown += new System.Windows.Input.MouseEventHandler(silverlight_control_MouseLeftButtonDown);
您可以自定义事件方法,如果想在JavaScript中使用.cs或.vb中声明托管事件,必须要使用Scriptable标记声明。
十四、 @
这个符号干什么用的呢?看看一下两句:
System.Console.WriteLine(“C:\\Windows\\Explorer.exe”);
System.Console.WriteLine(@”C:\Windows\Explorer.exe”);
两句输出完全一样……
明白了吧,@加在字符串常量前面,能让编译器知道你后面的那个常量没有转义字符,也就是说把’\’看作字符而不是转义符号。
另外,@支持两个””内加入换行符,譬如:
string s = @”This
is
an
example.”;
由于没有了转义符号,因此要表示”这个字符可以这样写:
string s = @”It’s called “”xxx””.”;//两个”连写表示一个”字符
==================
在子窗体调用父窗体功能,最好是用委托
在父窗体定义一个刷新函数
private void _Refresh()
{
xm_tree.treeview1.Refresh();
}
调用子窗体的时候绑定委托
SunForm sunform = new SunForm();
sunform.FatherRefresh = this._Refresh;
在子窗体定义委托
public delegate void DoAction();//如果有参数的话,定义参数
public DoAction FatherRefresh;
然后在子窗体关闭的时候调用
privte void Form_Closing()
{
//do something …….
FatherRefresh();
}
////////////////
父窗体
FrmXiangQing XQ = new FrmXiangQing();
XQ.Owner = this;
子窗体中
this.Owner=””;