1,mdi窗体
设有两个窗体frmmain,frmchild,则:
frmmain: 设ismdicontainer属性为true
打开子窗口:
在相关事件中写如下代码:
frmchild child=new frmchild();
child.mdiparent=this;//this表示本窗体为其父窗体
child.show();
在打开子窗体时,如果只允许有一个子窗体,可以加入如下判断:
if (this.activemdichild!=null)
{
this.activemdichild.close(); //关闭已经打开的子窗体
//....
}
更改mdi主窗体背景
先声明一个窗体对象
private system.windows.forms.mdiclient m_mdiclient;
在form_load等事件中,添加如下代码:
int icnt=this.controls.count;
for(int i=0;i<icnt;i++)
{
if(this.controls[i].gettype().tostring()=="system.windows.forms.mdiclient")
{
this.m_mdiclient=(system.windows.forms.mdiclient)this.controls[i];
break;
}
}
this.m_mdiclient.backcolor=system.drawing.color.silver;
具体可参见:http://cnblogs.com/daview/archive/2004/05/06/8381.aspx
2,创建系统托盘菜单
2.1,创建一个contextmenu(cmnmain)菜单
2.2,添加一个notifyicon组件,设置contextmenu属性为cmnmain
2.3,相应窗体改变事件(最小化等)
private void frmmain_sizechanged(object sender,eventargs e)
{
if (this.windowstate==formwindowstate.minimized)
{
this.hide();
noimain.visible=true;
}
}
2.4,相应用户单击系统托盘上contextmenu菜单事件
private void mniopen(object sender,eventargs e)
{
noimain.visible=false;
this.show();
this.focus();
}
2.5,响应用户双击系统托盘图标事件
private void noimain_doubleclick(object s,eventargs e)
{
minopen.performclick(); //相当与mniopen按钮的单击事件
}
**注意添加相应的事件句柄**
3,创建不规则窗体
3.1,在窗体上创建不规则图象,可以用gdi+绘制,或在图象控件上使用图象填充
3.2,设置窗体的backcolor为colora,然后设置transparencykey为colora
3.3,设置formborderstyle为none;
4,创建顶部窗体
this.topmost=true;//把窗体的topmost设置为true
5,调用外部程序
using system.diagnostics
process proc=new process();
[email protected]"notepad.exe"; //注意路径
proc.startinfo.arguments="";
proc.start();
//获得当前目录directory.getcurrentdirectory() (using system.io)
6,toolbar的使用
toolbar控件通常需要imagelist控件结合使用(需要用到其中图标)
响应toolbar单击事件处理程序代码:
switch(toolbarname.buttons.indexof(e.button))
{
case 0: //第一个按钮
//code ...
break;
case 1: //第二个按钮
//code ...
break;
//other case code
default: //默认处理,但以上所有项都不符合时
//code ...
break;
}
7,弹出对话框获得相关返回值
在窗体的closing事件中运行如下代码,可以在用户关闭窗体时询问
dialogresult result=messagebox.show(this,"真的要关闭该窗口吗?","关闭提示",messageboxbuttons.okcancel,messageboxicon.question);
if (result==dialogresult.ok)
{
//关闭窗口
e.cancel=false;
}
else
{
//取消关闭
e.cancel=true;
}
8,打印控件
最少需要两个控件
printdocument
printpreviewdialog:预览对话框,需要printdocument配合使用,即设置document属性为
对应的printdocument
printdocument的printpage事件(打印或预览事件处理程序)代码,必须.
float fltheight=0;
float fltlineperpage=0;
long lngtopmargin=e.marginbounds.top;
int intcount=0;
string strline;
//计算每页可容纳的行数,以决定何时换页
fltlineperpage=e.marginbounds.height/txtprinttext.font.getheight(e.graphics);
while(((strline=streamtoprint.readline()) != null) && (intcount<fltlineperpage))
{
intcount+=1;
fltheight=lngtopmargin+(intcount*txtprinttext.font.getheight(e.graphics));
e.graphics.drawstring(strline,txtprinttext.font,brushes.green,e.marginbounds.left,fltheight,new stringformat());
}
//决定是否要换页
if (strline!=null)
{
e.hasmorepages=true;
}
else
{
e.hasmorepages=false;
}
以上代码的streamtoprint需要声明为窗体级变量:
private system.io.stringreader streamtoprint;
打开预览对话框代码(不要写在printpage事件中)
streamtoprint=new system.io.stringreader(txtprinttext.text);
printpreviewdialogname.showdialog();
9,string对象本质与stringbuilder类,字符串使用
string对象是不可改变的类型,当我们对一个string对象修改后将会产生一个新的string对
象,因此在需要经常更改的字符对象时,建议使用stringbuilder类:
[范例代码]构造一个查询字符串
stringbuilder sb=new stringbuilder("");
sb.append("select * from employees where ");
sb.append("id={0} and ");
sb.append("title='{1}'");
string cmd=sb.tostring();
sb=null; //在不再需要时清空它
cmd=string.format(cmd,txtid.text,txttile.text); //用实际的值填充格式项
判断字符串是否为空:
检查一个字符串是否为空或不是一个基本的编程需要,一个有效的方法是使用string类的length属性来取代使用null或与""比较。
比较字符串:使用string.equals方法来比较两个字符串
string str1="yourtext";
if (str1.equals("teststing") )
{
// do something
}
10,判断某个字符串是否在另一个字符串(数组)中
需要用到的几个方法
string.split(char);//按照char进行拆分,返回字符串数组
array.indexof(array,string):返回指定string在array中的第一个匹配项的下标
array.lastindexof(array,string):返回指定string在array中的最后一个匹配项的下标
如果没有匹配项,则返回-1
[示例代码]:
string strnum="001,003,005,008";
string[] strarray=strnum.split(',');//按逗号拆分,拆分字符为char或char数组
console.writeline(array.indexof(strarray,"004").tostring());
11,datagrid与表和列的映射
从数据库读取数据绑定到datagrid后,datagrid的列标头通常跟数据库的字段名相同,如果
不希望这样,那么可以使用表和列的映射技术:
using system.data.common;
string strsql="select * from department";
oledbdataadapter adapter=new oledbdataadapter(strsql,conn);
datatablemapping dtmdep=adapter.tablemappings.add("department","部门表");
dtmdep.columnmappings.add("dep_id","部门编号");
dtmdep.columnmappings.add("dep_name","部门名称");
dataset ds=new dataset();
adapter.fill(ds,"department"); //此处不能用"部门表"
响应单击事件(datagrid的currentcellchanged事件)
datagridname.currentcell.columnnumber;//所单击列的下标,从0开始,下同
datagridname.currentcell.rownumber;//所单击行的下标
datagridname[datagridname.currentcell];//所单击行和列的值
datagridname[datagridname.currentrowindex,n].tostring();//获得单击行第n+1列的值
12,动态添加菜单并为其添加响应事件
添加顶级菜单:
mainmenuname.menuitems.add("顶级菜单一");//每添加一个将自动排在后面
添加次级菜单:
menuitem mniitemn=new menuitem("menuitemtext")
menuitem mniitemn=new menuitem("menuitemtext",new eventhandler(eventdealname))
mainmenuname.menuitems[n].menuitems.add(mniitemn);//n为要添加到的顶级菜单下标,从0开始
创建好菜单后添加事件:
mniitemn.click+=new eventhandler(eventdealname);
也可以在添加菜单的同时添加事件:
menuitem mniitemn=new menuitem("menuitemtext",new eventhandler(eventdealname));
mainmenuname.menuitems[n].menuitems.add(mniitemn);
13,正则表达式简单应用(匹配,替换,拆分)
using system.text.regularexpressions;
//匹配的例子
string strregextext="你的号码是:020-32234102";
string [email protected]"/d{3}-/d*";
regex regex=new regex(filter);
match match=regex.match(strregextext);
if (match.success) //判断是否有匹配项
{
console.writeline("匹配项的长度:"+match.length.tostring());
console.writeline("匹配项的字符串:"+match.tostring());
console.writeline("匹配项在原字符串中的第一个字符下标:"+match.index.tostring());
}
//替换的例子
string replacedtext=regex.replace(strregextext,"020-88888888");
console.writeline(replacedtext);//输出"你的号码是:020-88888888"
//拆分的例子
string strsplittext="甲020-32654已020-35648丙020-365984";
foreach(string s in regex.split(strsplittext))
{
console.writeline(s); //依次输出"甲乙丙"
}
13,多线程简单编程
using system.threading;
thread threadtest=new thread(new threadstart(threadcompute));
threadtest.start();//使用另一个线程运行方法threadcompute
threadcompute方法原型:
private void threadcompute()
{}
14,操作注册表
using system.diagnostics;
using microsoft.win32;
//操作注册表
registrykey regkey=registry.localmachine.opensubkey("software",true);
//添加一个子键并给他添加键值对
registrykey newkey=regkey.createsubkey("regnewkey");
newkey.setvalue("keyname1","keyvalue1");
newkey.setvalue("keyname2","keyvalue2");
//获取新添加的值
messagebox.show(newkey.getvalue("keyname1").tostring());
//删除一个键值(对)
newkey.deletevalue("keyname1");
//删除整个子键
regkey.deletesubkey("regnewkey");
本文来源于网页设计爱好者web开发社区http://www.html.org.cn收集整理,欢迎访问。