个人整理-C#编程实用小技巧- -
01、在C#应用程序中如何在运行时将窗口最大化?
02、利用C#编写Web下的邮件发送程序
03、C#DOS控制台程序连接SQLServer数据库的方法
04、C#中ListView的简单使用说明
05、C#中加载图片与读取图片上的像素点方法
06、窗体间传递复杂数据
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();
}
}