個人整理-C#編程實用小技巧- -
個人整理-C#編程實用小技巧- -
03、C#DOS控制臺程序連接SQLServer數據庫的方法
07、如何在.net的應用程序運行其它的EXE文件?
08、如何檢測當前操作系統?
09、如何獲取正在運行程序的路徑?
10、如何查看電腦中已經安裝的所有程序集?
11、如何用System.Windows.Forms.Application.CompanyName設置公司名稱?
12、如果用戶的電腦沒有安裝.NET運行框架,是否可以運行.NET的程序?
13、如何獲取本地的IP地址?
14、如何確保在C#中只有一個程序(實例)運行?
15、如何把所有的系統中正在運行的所有進程顯示出來呢?
16、如何列出所有正在運行的應用程序呢?
01、在C#應用程序中如何在運行時將窗口最大化?(TOP)
可以使用FormWindowState 枚舉,代碼如下所示:
private void Form1_Load(object sender, System.EventArgs e)
{
//實現C#打開后的窗口最大化;
this.WindowState = FormWindowState.Maximized;
}
02、利用C#編寫Web下的郵件發送程序(TOP)
創建一個C#項目中的APS.NET Web應用程序,命名為EmailPage;
按下圖所示添加各控件,并對各控件進行命名。注意:要將HTML控件FileField設置為服務器控件運行。
查看WebForm1.aspx的HTML源代碼,修改標簽,添加屬性設置encType="multipart/form-data";
在C#代碼中添加對命名空間System.Web.Mail的引用(需要使用該名稱空間下的MailMessage類和SmptMail類),MailMessage類對象用來設定要發送郵件的相關信息,如收件人,發件人,主題,內容,優先級,格式以及附件;使用SmptMail類的Send方法將MailMessage對象發送出去。
注:要在C:\Inetpub\wwwroot目錄下創建一個temp文件夾,用于將酵文件上傳到Web臨時目錄下,然后將服務器上的文件路徑賦給MailMessage對象的Attachments屬性即可。
“發送”按鈕的事件如下:
private void btnSend_Click(object sender, System.EventArgs e)
{
//創建一個MailMessage對象
MailMessage aMail = new MailMessage();
//收信人地址
aMail.To = txtTo.Text ;
//發信人地址
aMail.From = txtFrom.Text ;
//主題
aMail.Subject = txtSubject.Text;
//正文
aMail.Body = txtBody.Text ;
//優先級
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目錄下,
//需要在項目路徑下創建temp目錄
fileName = Server.MapPath(@"\temp\" + fileName);
//要在C:\Inetpub\wwwroot文件夾下創建temp文件夾用于存放臨時發送的文件
File1.PostedFile.SaveAs(fileName);
//添加附件
aMail.Attachments.Add(new MailAttachment(fileName));
}
string result = "";
try
{
//發送郵件
SmtpMail.Send(aMail);
result = "Email 發送成功!";
}
catch(Exception ex)
{
result = "Email 發送失敗。" + ex.Message ;
}
Response.Write ("
");
}
03、C#DOS控制臺程序連接SQLServer數據庫的方法(TOP)
①、建立一個C#的DOS控制臺應用程序;
②、添加命名空間:using System.Data.SqlClient;;
③、連接到數據源,通過創建一個使用連接字符串的連接對象來完成:
SqlConnection connection = new SqlConnection(@"Data Source=MySER;Integrated Security=SSPI;Initial Catalog=pubs");
其中的MySER是安裝了SQLServer的服務器名;pubs是SQLServer上的數據庫名。
④、打開連接對象,建立到數據庫的連接:
connection.Open();
⑤、創建對象命令,并給它提供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以只讀方式獲取數據結果:
SqlDataReader reader = command.ExecuteReader();
⑦、從DataReader中獲取數據:
while(reader.Read())
{
Console.WriteLine("{0}{1}\t{2}",reader["Ccname"],reader["MI_SQL_X"],reader["MI_SQL_Y"]);
}
⑧、關閉DataReader和SqlConnection。
04、C#中ListView的簡單使用說明(TOP)
在C#工程中添加一個ListView控件,控件名稱為listView1。
分別設置其屬性: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中創建一個窗體,加入pictureBox控件。設置其Image為空,SizeMode屬性設為AutoSize;
(2)加入一個button控件,用于打開圖片文件;
(3)加入三個textBox控件,用于表示RGB三個顏色的值。
(4)定義一個私有變量pick為布爾值,來表示是否拾取圖片上的顏色。并在Form1_Load中將其設置為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 ;
//設置當前窗體與圖片大小相當
this.ClientSize = new Size(pictureBox1.Width+20,pictureBox1.Height+60);
pick = true;//設為TRUE可以開始讀取像素點。
(6)為pictureBox控件增加mousemove事件:
if (pick)
{
Color pixelColor = this.myBitmap.GetPixel(e.X,e.Y);
//pixelColor = Color.FromArgb(255,0,0);//可以以此方法對COLOR變量進行RGB值設置。
textBox1.Text = pixelColor.R.ToString();
textBox2.Text = pixelColor.G.ToString();
textBox3.Text = pixelColor.B.ToString();
}
06、窗體間傳遞復雜數據(TOP)
源代碼下載請點這里
在設計窗體程序時往往需要相互調用的窗體間傳遞復雜的數據,有時候甚至需要子窗體修改父窗體的內容。前一陣在博客園中看到很多人討論這個問題,在海天一鷗《窗體間傳值和窗體間互操作》的評論中,我看到有這么幾種做法:1)公開一個靜態變量;2)在子窗體中創建一個公有字段;3)在父窗體中使用委托與事件;4)將子窗體作為父窗體成員。
這些辦法我感覺都不是特別好,會導致父窗體與子窗體耦合過于緊密,對任何一個窗體的修改需要重新編譯另外一個窗體。根據“依賴倒置”的原則,通過引入一個結果對象,就可以避免這種緊耦合,同時也可以傳遞任意復雜的數據。如果需要在子窗體中改變父窗體狀態,也可以在這個結果對象中定義委托與事件來達到目的。我在這里給出我的解決方案。
首先定義一個結果對象,用來存放子窗體返回的結果。同時定義一些事件,可以讓子窗體修改父窗體的狀態。代碼如下:
usingSystem;
namespaceWinParam
{
publicdelegatevoidTextChangedHandler(strings);
publicclasscResult
{
publicstringResult1="";
publicstringResult2="";
publiceventTextChangedHandlerTextChanged;
publicvoidChangeText(strings)
{
if(TextChanged!=null)
TextChanged(s);
}
}
}
添加一子窗體構造函數,允許接收一結果對象:
privatecResultr;
publicfrmChild(cResultr):this()
{
this.r=r;
}
在父窗體中創建子窗體,并訂閱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;
}
這樣確保父窗體知道子窗體,而子窗體不知道父窗體。父窗體改變后不需要重新編譯子窗體。同時兩個窗體都依賴于結果對象,結果對象的穩定性也決定了父窗體與子窗體關系的穩定性。下面是程序運行結果:
注:提供的代碼僅僅是功能演示,如果實際使用需要添加一些額外輔助代碼(對象釋放、取消事件訂閱等)。
07、如何在.net的應用程序運行其它的EXE文件?
解答:主要應用System.Diagnostics名字空間中的Process類
主要代碼:
Process proc = new Process();
proc.StartInfo.FileName = @"D:\Program Files\Foxmail\Foxmail.exe"; //可以用絕對路徑
proc.StartInfo.Arguments = "";
proc.Start();
08、如何檢測當前操作系統?
解答:應用System名字空間中的Environment類
主要代碼:
string versionText = Environment.OSVersion.Version.ToString();
09、如何獲取正在運行程序的路徑?
解答:調用Application類中的ExecutablePath靜態成員獲取路徑
主要代碼:
textBox1.Text = Application.ExecutablePath;
10、如何查看電腦中已經安裝的所有程序集?
解答:.Net Framework把所有的程序集安裝在系統安裝盤\winnt\Assembly(隱含)目錄下,查看屬性可以看到該程序集的所有詳細資料。
11、如何用System.Windows.Forms.Application.CompanyName設置公司名稱?
解答:在Assembly中設置,VS.Net的開發環境中是在 AssemblyInfo.cs(vb)的文件中設置的,打看文件可以
公司信息和版本等信息
主要代碼:
[assembly: AssemblyCompany("天極網蠶蛹-版權所有")]
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類型的數組,包含了計算機此時的所有的IP地址信息,包含了撥號上網得到的臨時分配的IP地址和局域網固定的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#中只有一個程序(實例)運行?
解答:主要應用System.Diagnostics名字空間中的Process類來實現,思路,我們在運行程序前,查找進程中是否有同名的進程,同時運行位置也相同程,如是沒有運行該程序,如果有,就將同名的同位置的程序窗口置前.
主要代碼:
public static Process RunningInstance()
{
Process current = Process.GetCurrentProcess();
Process[] processes = Process.GetProcessesByName (current.ProcessName);
//查找相同名稱的進程
foreach (Process process in processes)
{
//忽略當前進程
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、如何把所有的系統中正在運行的所有進程顯示出來呢?
解答:用System.Diagnostics名字空間中的Process.GetProcess()靜態成員
主要代碼:
Using System.Diagnostics;
...
foreach ( Process p in Process.GetProcesses() )
Console.WriteLine( p ); // string s = p.ToString();
16、如何列出所有正在運行的應用程序呢?
解答:可有用EnumWindows 函數將枚舉計算機上的所有現有窗口,但我們用System.Diagnostics名字空間的靜態函數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();
}
}
posted on 2005-11-24 09:19 夢在天涯 閱讀(2819) 評論(4) 編輯 收藏 引用 所屬分類: C#/.NET