欢迎光临
我们一直在努力

.Net WinForm学习笔记-.NET教程,Asp.Net开发

建站超值云服务器,限时71元/月

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();

proc.startinfo.filename=@"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 filter=@"\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");

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » .Net WinForm学习笔记-.NET教程,Asp.Net开发
分享到: 更多 (0)