個人整理-C#編程實用小技巧- -
01、在C#應(yīng)用程序中如何在運行時將窗口最大化?
02、利用C#編寫Web下的郵件發(fā)送程序
03、C#DOS控制臺程序連接SQLServer數(shù)據(jù)庫的方法
04、C#中ListView的簡單使用說明
05、C#中加載圖片與讀取圖片上的像素點方法
06、窗體間傳遞復(fù)雜數(shù)據(jù)
07、如何在.net的應(yīng)用程序運行其它的EXE文件?
08、如何檢測當(dāng)前操作系統(tǒng)?
09、如何獲取正在運行程序的路徑?
10、如何查看電腦中已經(jīng)安裝的所有程序集?
11、如何用System.Windows.Forms.Application.CompanyName設(shè)置公司名稱?
12、如果用戶的電腦沒有安裝.NET運行框架,是否可以運行.NET的程序?
13、如何獲取本地的IP地址?
14、如何確保在C#中只有一個程序(實例)運行?
15、如何把所有的系統(tǒng)中正在運行的所有進程顯示出來呢?
16、如何列出所有正在運行的應(yīng)用程序呢?
01、在C#應(yīng)用程序中如何在運行時將窗口最大化?(TOP)
可以使用FormWindowState 枚舉,代碼如下所示:
private void Form1_Load(object sender, System.EventArgs e)
{
//實現(xiàn)C#打開后的窗口最大化;
this.WindowState = FormWindowState.Maximized;
}
02、利用C#編寫Web下的郵件發(fā)送程序(TOP)
創(chuàng)建一個C#項目中的APS.NET Web應(yīng)用程序,命名為EmailPage;
按下圖所示添加各控件,并對各控件進行命名。注意:要將HTML控件FileField設(shè)置為服務(wù)器控件運行。

查看WebForm1.aspx的HTML源代碼,修改標(biāo)簽,添加屬性設(shè)置encType="multipart/form-data";
在C#代碼中添加對命名空間System.Web.Mail的引用(需要使用該名稱空間下的MailMessage類和SmptMail類),MailMessage類對象用來設(shè)定要發(fā)送郵件的相關(guān)信息,如收件人,發(fā)件人,主題,內(nèi)容,優(yōu)先級,格式以及附件;使用SmptMail類的Send方法將MailMessage對象發(fā)送出去。
注:要在C:\Inetpub\wwwroot目錄下創(chuàng)建一個temp文件夾,用于將酵文件上傳到Web臨時目錄下,然后將服務(wù)器上的文件路徑賦給MailMessage對象的Attachments屬性即可。
“發(fā)送”按鈕的事件如下:
private void btnSend_Click(object sender, System.EventArgs e)
{
//創(chuàng)建一個MailMessage對象
MailMessage aMail = new MailMessage();
//收信人地址
aMail.To = txtTo.Text ;
//發(fā)信人地址
aMail.From = txtFrom.Text ;
//主題
aMail.Subject = txtSubject.Text;
//正文
aMail.Body = txtBody.Text ;
//優(yōu)先級
aMail.Priority = (MailPriority)ddPriority.SelectedIndex ;
//正文格式
aMail.BodyFormat = (MailFormat)ddBodyFormat.SelectedIndex ;
ddPriority.SelectedIndex = 1;
ddBodyFormat.SelectedIndex = 0;
if (File1.PostedFile.FileName != "" )
{
//上傳文件的文件名(含完整路徑)
string fileName = File1.PostedFile.FileName;
fileName = fileName.Substring (fileName.LastIndexOf (@"\"));
//使用SaveAs方法,將文件保存在項目路徑\temp目錄下,
//需要在項目路徑下創(chuàng)建temp目錄
fileName = Server.MapPath(@"\temp\" + fileName);
//要在C:\Inetpub\wwwroot文件夾下創(chuàng)建temp文件夾用于存放臨時發(fā)送的文件
File1.PostedFile.SaveAs(fileName);
//添加附件
aMail.Attachments.Add(new MailAttachment(fileName));
}
string result = "";
try
{
//發(fā)送郵件
SmtpMail.Send(aMail);
result = "Email 發(fā)送成功!";
}
catch(Exception ex)
{
result = "Email 發(fā)送失敗。" + ex.Message ;
}
Response.Write ("
");
}
03、C#DOS控制臺程序連接SQLServer數(shù)據(jù)庫的方法(TOP)
①、建立一個C#的DOS控制臺應(yīng)用程序;
②、添加命名空間:using System.Data.SqlClient;;
③、連接到數(shù)據(jù)源,通過創(chuàng)建一個使用連接字符串的連接對象來完成:
SqlConnection connection = new SqlConnection(@"Data Source=MySER;Integrated Security=SSPI;Initial Catalog=pubs");
其中的MySER是安裝了SQLServer的服務(wù)器名;pubs是SQLServer上的數(shù)據(jù)庫名。
④、打開連接對象,建立到數(shù)據(jù)庫的連接:
connection.Open();
⑤、創(chuàng)建對象命令,并給它提供SQL命令(從TN_RP表中選取 Ccname, MI_SQL_X,MI_SQL_Y 字段):
SqlCommand command = connection.CreateCommand();
command.CommandText = "SELECT Ccname, MI_SQL_X,MI_SQL_Y from TN_RP";
⑥、使用DataReader以只讀方式獲取數(shù)據(jù)結(jié)果:
SqlDataReader reader = command.ExecuteReader();
⑦、從DataReader中獲取數(shù)據(jù):
while(reader.Read())
{
Console.WriteLine("{0}{1}\t{2}",reader["Ccname"],reader["MI_SQL_X"],reader["MI_SQL_Y"]);
}
⑧、關(guān)閉DataReader和SqlConnection。
04、C#中ListView的簡單使用說明(TOP)
在C#工程中添加一個ListView控件,控件名稱為listView1。
分別設(shè)置其屬性:View為Detail,然后為其Column增加項。
添加List項的代碼部分如下:
while(reader.Read())
{
string[] subItem={i.ToString(),reader["Ccname"].ToString(),reader["MI_SQL_X"].ToString(),reader["MI_SQL_Y"].ToString()};
//定義每個項的子串;這里是每個列表項有四個條目;
ListViewItem item = new ListViewItem(subItem);
listView1.Items.Insert(i,item);
i++;
}
讀取的方法是:
private void button1_Click(object sender, System.EventArgs e)
{
MessageBox.Show(listView1.SelectedItems[0].SubItems[1].Text.ToString());
//SelectItems[0]是所選項的第一個(因為有MutiSelect屬性),SubItems[1]是所選項的第二個列的值
}
05、C#中加載圖片與讀取圖片上的像素點方法(TOP)
(1)在.NET中創(chuàng)建一個窗體,加入pictureBox控件。設(shè)置其Image為空,SizeMode屬性設(shè)為AutoSize;
(2)加入一個button控件,用于打開圖片文件;
(3)加入三個textBox控件,用于表示RGB三個顏色的值。
(4)定義一個私有變量pick為布爾值,來表示是否拾取圖片上的顏色。并在Form1_Load中將其設(shè)置為false;再加入一個public Bitmap myBitmap用來進行函間的訪問。
(5)為button控件增加click事件,該事件主要是完成讀入文件和對pictureBox控件的初始化:
OpenFileDialog of = new OpenFileDialog();
of.Filter = "JPG圖像(*.jpg)|*.jpg|BMP圖像(*.bmp)|*.bmp|所有文件(*.*)|*.*";
of.FilterIndex = 0;
of.ShowDialog();
String filename = of.FileName.ToString();
//在此處加載一個新的圖片。
this.myBitmap = new Bitmap(filename);
// Stretches the image to fit the pictureBox.
pictureBox1.SizeMode = PictureBoxSizeMode.AutoSize;
Bitmap myImage = this.myBitmap;//new Bitmap(fileToDisplay);
//pictureBox1.ClientSize = new Size(xSize, ySize);
pictureBox1.Image = (Image) myImage ;
//設(shè)置當(dāng)前窗體與圖片大小相當(dāng)
this.ClientSize = new Size(pictureBox1.Width+20,pictureBox1.Height+60);
pick = true;//設(shè)為TRUE可以開始讀取像素點。
(6)為pictureBox控件增加mousemove事件:
if (pick)
{
Color pixelColor = this.myBitmap.GetPixel(e.X,e.Y);
//pixelColor = Color.FromArgb(255,0,0);//可以以此方法對COLOR變量進行RGB值設(shè)置。
textBox1.Text = pixelColor.R.ToString();
textBox2.Text = pixelColor.G.ToString();
textBox3.Text = pixelColor.B.ToString();
}
06、窗體間傳遞復(fù)雜數(shù)據(jù)(TOP)
源代碼下載請點這里
在設(shè)計窗體程序時往往需要相互調(diào)用的窗體間傳遞復(fù)雜的數(shù)據(jù),有時候甚至需要子窗體修改父窗體的內(nèi)容。前一陣在博客園中看到很多人討論這個問題,在海天一鷗《窗體間傳值和窗體間互操作》的評論中,我看到有這么幾種做法:1)公開一個靜態(tài)變量;2)在子窗體中創(chuàng)建一個公有字段;3)在父窗體中使用委托與事件;4)將子窗體作為父窗體成員。
這些辦法我感覺都不是特別好,會導(dǎo)致父窗體與子窗體耦合過于緊密,對任何一個窗體的修改需要重新編譯另外一個窗體。根據(jù)“依賴倒置”的原則,通過引入一個結(jié)果對象,就可以避免這種緊耦合,同時也可以傳遞任意復(fù)雜的數(shù)據(jù)。如果需要在子窗體中改變父窗體狀態(tài),也可以在這個結(jié)果對象中定義委托與事件來達到目的。我在這里給出我的解決方案。
首先定義一個結(jié)果對象,用來存放子窗體返回的結(jié)果。同時定義一些事件,可以讓子窗體修改父窗體的狀態(tài)。代碼如下:
usingSystem;
namespaceWinParam
{
publicdelegatevoidTextChangedHandler(strings);
publicclasscResult
{
publicstringResult1="";
publicstringResult2="";
publiceventTextChangedHandlerTextChanged;
publicvoidChangeText(strings)
{
if(TextChanged!=null)
TextChanged(s);
}
}
}
添加一子窗體構(gòu)造函數(shù),允許接收一結(jié)果對象:
privatecResultr;
publicfrmChild(cResultr):this()
{
this.r=r;
}
在父窗體中創(chuàng)建子窗體,并訂閱cResult事件:
privatevoidbtnCallChild_Click(objectsender,System.EventArgse)
{
cResultr=newcResult();
r.TextChanged+=newTextChangedHandler(this.EventResultChanged);
frmChildfc=newfrmChild(r);
fc.ShowDialog();
txtCallResult.Text="TheResultis: "+r.Result1+" "+r.Result2;
}
privatevoidEventResultChanged(strings)
{
txtEventResult.Text=s;
}
這樣確保父窗體知道子窗體,而子窗體不知道父窗體。父窗體改變后不需要重新編譯子窗體。同時兩個窗體都依賴于結(jié)果對象,結(jié)果對象的穩(wěn)定性也決定了父窗體與子窗體關(guān)系的穩(wěn)定性。下面是程序運行結(jié)果:
注:提供的代碼僅僅是功能演示,如果實際使用需要添加一些額外輔助代碼(對象釋放、取消事件訂閱等)。
07、如何在.net的應(yīng)用程序運行其它的EXE文件?
解答:主要應(yīng)用System.Diagnostics名字空間中的Process類
主要代碼:
Process proc = new Process();
proc.StartInfo.FileName = @"D:\Program Files\Foxmail\Foxmail.exe"; //可以用絕對路徑
proc.StartInfo.Arguments = "";
proc.Start();
08、如何檢測當(dāng)前操作系統(tǒng)?
解答:應(yīng)用System名字空間中的Environment類
主要代碼:
string versionText = Environment.OSVersion.Version.ToString();
09、如何獲取正在運行程序的路徑?
解答:調(diào)用Application類中的ExecutablePath靜態(tài)成員獲取路徑
主要代碼:
textBox1.Text = Application.ExecutablePath;
10、如何查看電腦中已經(jīng)安裝的所有程序集?
解答:.Net Framework把所有的程序集安裝在系統(tǒng)安裝盤\winnt\Assembly(隱含)目錄下,查看屬性可以看到該程序集的所有詳細資料。
11、如何用System.Windows.Forms.Application.CompanyName設(shè)置公司名稱?
解答:在Assembly中設(shè)置,VS.Net的開發(fā)環(huán)境中是在 AssemblyInfo.cs(vb)的文件中設(shè)置的,打看文件可以
公司信息和版本等信息
主要代碼:
[assembly: AssemblyCompany("天極網(wǎng)蠶蛹-版權(quán)所有")]
12、如果用戶的電腦沒有安裝.NET運行框架,是否可以運行.NET的程序?
解答:不可以,必需安裝.NET Framework
可在下面地址下載http://msdn.microsoft.com/library/default.asp?url=/downloads/list/netdevframework.asp
13、如何獲取本地的IP地址?
解答:在名字空間System.Net中定義了一個類Dns,其中有一個方法GetHostByName(),用來返回IPHostEntry 對象,此對象有一個屬性是AddressList,此屬性是一個IPAddress類型的數(shù)組,包含了計算機此時的所有的IP地址信息,包含了撥號上網(wǎng)得到的臨時分配的IP地址和局域網(wǎng)固定的IP地址
主要代碼:
string s="";
System.Net.IPAddress[] addressList = Dns.GetHostByName(Dns.GetHostName()).AddressList;
for (int i = 0; i < addressList.Length; i ++)
{
s += addressList[i].ToString();
}
14、如何確保在C#中只有一個程序(實例)運行?
解答:主要應(yīng)用System.Diagnostics名字空間中的Process類來實現(xiàn),思路,我們在運行程序前,查找進程中是否有同名的進程,同時運行位置也相同程,如是沒有運行該程序,如果有,就將同名的同位置的程序窗口置前.
主要代碼:
public static Process RunningInstance()
{
Process current = Process.GetCurrentProcess();
Process[] processes = Process.GetProcessesByName (current.ProcessName);
//查找相同名稱的進程
foreach (Process process in processes)
{
//忽略當(dāng)前進程
if (process.Id != current.Id)
{
//確認相同進程的程序運行位置是否一樣.
if (Assembly.GetExecutingAssembly().Location.Replace("/", "\\") == current.MainModule.FileName)
{
//Return the other process instance.
return process;
}
}
}
//No other instance was found, return null.
return null;
}
15、如何把所有的系統(tǒng)中正在運行的所有進程顯示出來呢?
解答:用System.Diagnostics名字空間中的Process.GetProcess()靜態(tài)成員
主要代碼:
Using System.Diagnostics;
...
foreach ( Process p in Process.GetProcesses() )
Console.WriteLine( p ); // string s = p.ToString();
16、如何列出所有正在運行的應(yīng)用程序呢?
解答:可有用EnumWindows 函數(shù)將枚舉計算機上的所有現(xiàn)有窗口,但我們用System.Diagnostics名字空間的靜態(tài)函數(shù)Process.GetProcesses()可以避免EnumWindows的互操作性問題。
主要代碼:
Using System.Diagnostics;
...
foreach ( Process p in Process.GetProcesses(System.Environment.MachineName) )
{
if( p.MainWindowHandle != IntPtr.Zero)
{
//顯示用戶程序名
Console.WriteLine( p ); // string s = p.ToString();
}
}