一些很酷的.Net技巧
时间:2010-08-20 来源:天宇之星
一..Net Framework" r. |2 P; u3 P9 s8 J$ I0 e
1.
- s# |8 \; S5 a, k/ m如何获得系统文件夹# L. n; ~( O: O7 g$ [7 B
使用System.Envioment类的GetFolderPath方法;例如:1 ?7 m. w0 W6 N& Z! q4 W9 a
Environment.GetFolderPath( Environment.SpecialFolder.Personal )6 L& k) x8 {* b, _
2.& L1 T! D4 K' x8 d) r
如何获得正在执行的exe文件的路径- ^9 \( z8 H& }9 B H' \
1)
# r. c3 B, h5 s# R使用Application类的ExecutablePath属性9 m* J" Q9 d4 T4 s$ g o
2)
8 Q0 a) O) n; S/ _6 iSystem.Reflection.Assembly.GetExecutingAssembly().Location9 W' p! Q; n0 N. g' z) l
3.
0 C J& U1 |7 K$ ?如何检测操作系统的版本
T) L3 r2 y1 C' ^' s' `使用Envioment的OSVersion属性,例如: J- I/ |, W9 G) ^/ r
OperatingSystem os = Environment.OSVersion;
2 C$ _; Y: k0 v% T# C/ }MessageBox.Show(os.Version.ToString());! \; I$ `, |* z' I9 y' ]
MessageBox.Show(os.Platform.ToString());
( u) h$ G1 R" s E. x5 d X; @' K4.
6 K* A: M" |7 @$ e& C7 U5 V8 V7 Z6 P# R- r如何根据完整的文件名获得文件的文件名部分、
) c. g8 v9 O/ ]/ Q使用System.IO.Path类的方法GetFileName或者GetFileNameWithoutExtension方法
& {) h, x2 v) t( V% B; H5.
2 z% M( h; p& B" s/ X如何通过文件的全名获得文件的扩展名
5 o/ {% q7 B# c8 m使用System.IO.Path.GetExtension静态方法
0 u% L7 R& m% [8 t6.
! L# E3 w2 M: O# Y+ HVb和c#的语法有什么不同click here6 M- z5 m8 m, S. E
7.
! q: e, l' a! [7 i5 v: j+ m# }如何获得当前电脑用户名,是否联网,几个显示器,所在域,鼠标有几个键等信息
# r, p+ @! P2 O) g- x+ L使用System.Windows.Forms. SystemInformation类的静态属性" ^/ u9 F# D4 R7 z \+ W) O
8." _0 U) t' Y ]/ I+ J
修饰Main方法的[STAThread]特性有什么作用
7 x3 Z$ [0 r+ u. |6 C标示当前程序使用单线程的方式运行3 f: _" m7 y+ G4 W; U
9. d$ v7 f. W$ ]) k7 |; f& `3 I5 |# }
如何读取csv文件的内容 " t) t4 L/ p! ]! Q% S
通过OdbcConnection可以创建一个链接到csv文件的链接,链接字符串的格式是:"Driver={Microsoft Text Driver (*.txt;*.csv)};Dbq="+cvs文件的文件夹路径+"0 a$ O% O" p: ?7 [) }3 x
Extensions=asc,csv,tab,txt; Persist Security Info=False";
# c! R; ?# ?9 j创建连接之后就可以使用DataAdapter等存取csv文件了。3 _0 I4 V7 i$ B* [ d$ f
详细信息见此处
' Y% F0 P7 G2 t: Z2 C; _$ w
10. 如何获得磁盘开销信息,代码片断如下,主要是调用kernel32.dll中的GetDiskFreeSpaceEx外部方法。

1 H) @2 j. g Y! i$ x: x8 K. }sealed
* ~. `& d/ O' q1 ~0 y: ]class DriveInfo
/ J$ ]% U6 K C# R4 ^6 e



# [0 ^+ B p+ ~" g- j

* u7 e* V& e+ b% h' @, ~% G: p- {"GetDiskFreeSpaceExA")]
$ o, v: u& o2 N( Q

static
* |# u' n' r0 t# a, O6 ?extern3 s# _5 ^8 C; ?! E0 g( B5 J
long GetDiskFreeSpaceEx(string lpDirectoryName,
, U. H* L9 n1 x9 O

long lpFreeBytesAvailableToCaller,
( X4 l5 \8 N- h& j

long lpTotalNumberOfBytes,
* G/ h+ `; s* L1 e( {0 m

long lpTotalNumberOfFreeBytes);$ l6 y2 P4 X- D" P3 U6 N; l j


8 f2 ?3 W7 ^& D6 c5 M/ \5 L. j, Mstatic( v9 e h% y$ ]# b( P
long GetInfo(string drive, out; @5 M. E$ C( G# }5 K& u
long available, out
- z# |0 M9 l2 w7 d" W" hlong total, out
, a+ c" ~% B, n# {4 xlong free)
! f: }4 b4 ]3 P% M: F: P6 g" ~5 n




0 q( }3 z" {& P. d



static DriveInfoSystem GetInfo(string drive)' ]0 U T% v2 V& R0 U6 [, {. y



9 ?" }8 ]8 Y- ^9 Y, \



new DriveInfoSystem(drive, result, available, total, free);
$ m5 Z8 c% T8 z! e$ E


# l2 @) v v# f! s

W& Y" p( d' h* ]

struct DriveInfoSystem$ b+ T0 q- ^+ D% ^. l E" N# G+ W8 y, b4 L




readonly5 S1 {- l% S' T% G& ?0 u
string Drive;* O6 b. u7 g. S# _) C

/ [: ?( T5 V: U3 ~: [& j! breadonly
9 I J6 M. r$ p& x+ c- Zlong Result;
1 y( J% c; S) L* d2 \; g1 Z2 q3 b

readonly
# b9 ]; ` F8 n) Ilong Available;
4 I/ [( s$ q" D7 r$ N

/ X6 ` k& I! A `readonly
8 y3 k0 |' _' \+ @# M; |+ Dlong Total;
1 b; K' b9 n. b" N5 w7 Q: D0 Q

readonly* E9 a# F6 ^3 [* q6 ] J# [
long Free;
5 r6 w' k" Y9 u- A! Y6 _

4 d" u3 D. C% f

% f0 b2 S: ?( Q) \- K' W; O





! |1 Z0 v! w. R8 x: J% t

% i8 s4 H* w h' b3 |



* B% }! W/ }5 `. v: Z


8 }( Z) ]' j9 A$ C) X: O/ w
可以通过
DriveInfoSystem info = DriveInfo.GetInfo("c:");来获得指定磁盘的开销情况
11.如何获得不区分大小写的子字符串的索引位置
2 u* B5 l+ z2 Q. B
1)通过将两个字符串转换成小写之后使用字符串的IndexOf方法:
string strParent =
4 d/ q; q' Q7 U6 n/ e9 y' M" C"The Codeproject site is very informative.";
+ i+ ?- {- |0 h7 P; c, b2 |3 R7 i9 `% D+ { S _' R9 T
string strChild =2 O6 F; l) h+ G* _/ f& ?. Q/ p
"codeproject";0 u; h) L2 b( ]* c$ S; `2 |1 B0 W
! d6 L. F" T& ~( M* a4 I// The line below will return -1 when expected is 4.
# V8 w- H' k* }" f' w9 A, |int i = strParent.IndexOf(strChild);7 P" G! M5 w! Q
& t* `( ^1 ]) F
// The line below will return proper index
U( ^7 Y1 z6 {' t3 ]5 Iint j = strParent.ToLower().IndexOf(strChild.ToLower());) w) C4 z# R$ V
! I" j" N4 P* t: E
2)
: E' K, h* f2 z" u$ _# t1 g
一种更优雅的方法是使用System.Globalization命名空间下面的CompareInfo类的IndexOf方法:
0 `3 L# q8 }: y: r

; |1 T5 H3 J: r% i! H

# W( l, S( P- H% r2 }$ r5 G- b

& e4 x# H& V* w. V"The Codeproject site is very informative.";
- @7 G |# h$ [& a4 }" F% u


- s' o9 I3 _6 k! Z2 n$ v0 k: d"codeproject";
: P; R) J# H+ W8 {7 E2 Q7 R |

& L$ s9 x" f( n* w


9 d7 h8 U" K' m, |( X


二
. OOPs
1. 什么是复制构造函数
我们知道构造函数是用来初始化我们要创建实例的特殊的方法。通常我们要将一个实例赋值给另外一个变量c#只是将引用赋值给了新的变量实质上是对同一个变量的引用,那么我们怎样才可以赋值的同时创建一个全新的变量而不只是对实例引用的赋值呢?我们可以使用复制构造函数。
我们可以为类创造一个只用一个类型为该类型的参数的构造函数,如:
7 \2 R2 d$ H- T F
0 ~, D" k: H3 ?7 kpublic Student(Student student)
3 |! X1 b( Q9 a& C$ C; b0 @0 ?* |{- R/ N9 t' Y0 ]
this.name = student.name;
. z8 `5 F% W4 w8 p3 \}
# L; f0 r) t" O1 g- I, o% ^. P
3 x- f6 Z3 Y* v & e& p5 l, c, }6 c
使用上面的构造函数我们就可以复制一份新的实例值,而非赋值同一引用的实例了。
2 l! d; W* C, I- j4 v9 eclass Student
0 G$ ]; I: h7 V{
7 J6 A, C% X) z3 N' j( v6 q private# X M# S1 N& P# q p* f
string name;, X. ^5 c5 N4 O8 d# q
4 p( H. l3 K, b public Student(string name)
& y, d8 B% t+ q+ C$ ?9 }' S1 Q2 W$ T
{/ S2 v* x$ j5 N2 H5 y) B; x
this.name = name;
$ k7 |5 P8 }) z7 r" U% e* i8 G }, r4 a+ g2 ^6 y. ^! {- H, Z9 {7 N+ w
public Student(Student student)) K% w7 f% t, B$ {
{" D9 l! w4 |0 l* n; o% C$ J/ n R5 v
this.name = student.name;$ f _+ P9 g' Z# _; q" w
}# g. [1 @; A3 _5 \! S
, O: U& I- a# Z+ D/ b7 q, E
public" ^ S: I' N f: A& E/ H7 |" @8 P
string Name 4 J- H7 S9 M' u& H" U/ Q
{
; l8 K, `. k C get
5 r8 T5 G: s% A0 n6 G
{
: D( ~$ a2 U" j- J3 X* Q8 {0 \ return name;
7 t2 p$ o C" M g }
/ I* d6 k( t$ C2 \ set % I: x& |4 i" P$ q0 S
{
/ N- R! S* u3 y name = value; # N3 u- g7 Z8 a4 B
}9 ?; j. u$ _* R4 f
}
3 A0 G2 D( s' `% m}6 w+ @# k/ U6 `+ \; M5 e8 }
+ f) C& {; u1 J8 vclass Final
2 B& w0 P1 q+ R5 J# j/ N* C* D) W2 C. U& x( W
{) J a' K; \- y, g1 c
: I( R$ Z* k# Z# k2 O# ?! v; l
static: U. L4 B* x! s# E. C7 a7 f8 @
void Main(); x; d: I5 e! Y0 n
) w9 y2 u- M7 L- i: j0 ? K" u& S
{
+ X) |+ _. f- w" ^% R" i$ i: g2 o$ Q
- G3 v! v9 u. ^# _& n Student student =- X4 ~2 X2 S) J% D- G5 P6 e
new Student ("A");
: M, @/ W* ^$ F' \- Q% t
1 ^/ u. u% U4 f, i$ q9 f2 R Student NewStudent =+ F, w- X% f. x) F. g
new Student (student);; d5 G' e5 d3 P, p: p
- R. N* Y$ w/ V1 M7 X7 D
student.Name =
5 G F6 |; E% `8 t- J7 ~5 t( f"B";
7 [% W e, U$ q. _9 n% d" ~7 k- M6 k0 `9 J
System.Console.WriteLine("The new student's name is {0}", NewStudent.Name);
n9 h- Z# N# Q! J4 l% J; R
. c& |9 a) b& \2 K a- I7 z3 R0 t }5 E, k6 M& ^, i6 {/ s' f- e0 l
2 y9 `+ w7 ]$ H( |}7 a/ G% z- s! l$ j) z) k
3 O5 m. Y# r/ S
* y& @. g7 h" I' [, q* C) bThe new student's name is A.% A, r6 R/ b1 `- W9 P; K2 b
2.什么是只读常量' G/ F, m7 o# K/ _$ d5 C
就是静态的只读变量,它通常在静态构造函数中赋值。 9 y- S! P9 {& g" [
class Numbers
* P6 ^; {3 Q4 m t% c{
) E% U' m; T8 n- A$ e/ X public* M+ m$ C+ d9 y1 I
readonly R: Y. Z$ C4 x* m6 e3 W7 o, F
int m;
* e: ^+ U! o$ h: f9 g3 s4 J2 H public
' e8 j' R/ ~& R8 x; W1 Y4 Gstatic
: `/ ?; s+ d' rreadonly
$ i8 W q9 z2 Xint n;* e J" J* H7 x9 W4 T, o) v* o& O
& D% l- l/ h( m& S5 u. ]' T
public Numbers (int x)# A: g$ {; U, \/ `) @
{) d9 j. S* s% k( X% _
m=x;
8 ]$ S4 x# c' G8 x# b8 M } c) i; O; w& S# y X
, p* v6 q1 z: `; }# ` y; h5 s
static Numbers ()
' a# B1 F# S' u: L: n' U
{* `$ q+ N5 B+ H0 V$ K7 H' m
n=100;
% C& M$ L; P. u! L, T }; X2 `2 f+ J' ~1 t0 \
/ o0 _ P2 y' X- Q' ~ }
( G1 ]& E0 I, H, M5 e# f' z! _//其中n就是一个只读的常量,对于该类的所有实例他只有一种值,而m则根据实例不同而不同
) H; w& p7 M. ?6 R, ?: D3 q5 z
% Z+ g& c% P' U$ k+ b: W9 e
" x* K- U) J" ?2 P3 Z+ m9 f7 g三.VS.Net IDE
$ s' U3 |" J) q) r' L) y1. 2请看原作2 Y4 X8 d% M% H9 l% K, Z0 `5 E
3.如何改变region的颜色. ]1 {1 \- n4 e) V
通过工具 à 选项 à 环境 à 字体和颜色 à 可折叠文本设置
2 o6 O% {1 G, M; L+ q9 I
) N% U. n" w: B) d. C6 l; t' A四.WinForm' E% {7 s" k; g) n& J6 F
1.如何使winForm不显示标题栏?2 _& } e/ a$ ]. j
通过设置form的Text属性为空字符串,设置ControlBox属性为false; X- y! w0 p0 @ X/ E
form1.Text = string. Empty; 8 e. w9 A2 d1 L/ O1 c
form1.ControlBox = false;" Q( ^, z" }/ s1 T7 n x/ N
2.如何使winform的窗体使用XP的风格; ~. Y3 \. A7 ?& K7 y5 w
见原作1 W% Q; [2 |$ l$ q
3.如何禁止form在工具栏显示
- M7 b7 p" ~8 \! `/ r8 K设置form的ShowInTaskbar属性为false即可2 S+ D/ v7 C- g3 o4 \+ x
4.如何使程序打开默认的邮件程序并带有一些参数让用户开始写邮件$ H% `2 _7 M0 {! T5 |, i U! a
3 ]% ~1 P* Y8 v# y- S0 {
1)如果是web程序:# `; E6 U' D; @) Z
4 z+ Z3 _* w7 R
<a href=”mailto:[email protected],[email protected][email protected]&Subject=Hello&body=Happy New Year”>some text</a>* |7 T! g8 z% N/ {1 E
$ `! h( u& i7 U6 w2) 对于windows程序,需要使用System.Diagnostics.Process类4 y" [# P1 J I- X! M8 e
3 u) @. A# s& `1 h* nProcess process =8 z6 v9 N' H9 G! ^2 P# J( g9 x
new Process();! m' [8 j [6 [3 v7 \# k) `
process.StartInfo.FileName =
' K* Y0 _' r( A4 p# x"mailto:[email protected],[email protected]?subject=Hello&[email protected]
- r3 ?7 q- s0 x&[email protected]&body=Happy New Year" ;) p' j0 c3 d3 v8 U, ]
$ e, `7 ]. l* P, p4 J& A% W
process.Start();. U# N! ?- u c0 t/ j
/ h6 U0 N& j% y/ `% f" @. L6 y3 v- h, x! Q8 q/ _3 A
5.如何创建类似msn提示窗口( t6 u9 D7 d: f) r# R
需要获得通过Screen.GetWorkingArea(this).Width(Height)属性获得屏幕的大小,然后使用一个timer根据时间改变窗口的位置
7 P3 q4 G6 y7 l. k8 s$ I) L/ I五.Button控件, s v6 f: Z1 L( O
1.如何设置form的默认button(即在form上按下回车时触发的button) F4 k. k# ?/ M7 v$ [6 {
可以设置form的AcceptButton属性:form1.AcceptButton = button1;. t* ~: n q. g, n
2. 如何设置form的取消button(即在用户按下Esc键时触发的button)
: r* E) V8 q3 C6 X) @9 ^4 Z 可以设置form的CancelButton属性:form1.CancelButton = buttonC;
; J- N$ ^& g7 u7 }5 U& I k: h3. 如何通过程序触发一个button的Click事件 N( G2 H! E0 [. [
& |% e& e0 ]( F/ ]
Button1.PerformClick
" f j z- i- b M( o/ l
2 Y0 r- L& @# s( d2 X六.Combo Box
5 L& u& ^9 _8 y1 Q: P# o6 ~# [# g. s1.如何使用可选字体填充Combo Box# {1 E( H* h: l4 M% L
comboBox1.Items.AddRange (FontFamily.Families);
8 g3 B# `6 p0 w1 d; a
; B) H+ N5 L7 f4 S+ P( U' {七.TextBox9 o; S: q% }- W- O8 `
1.如何禁用TextBox的默认上下文菜单(右键菜单)) U! D% Z$ O9 N' a$ I
textBox1.ContextMenu = new ContextMenu();! M* g# w' J$ }8 a; H3 s: ]
2,3 见原作
; }4 M5 _, s. Q4.如何在TextBox获得焦点的时候,将焦点放在textBox文字的最后
' G; A+ v5 u% u" ]% d- MtextBox1.SelectionStart = textBox1.Text.Length;/ V! R* D& k3 G3 I/ L4 J( X
引用:http://tech.techweb.com.cn/thread-249040-1-1.html