C#笔记
用例:
OpenFileDialog dlg = new OpenFileDialog(); dlg.Title = "Open Photo"; dlg.Filter = "jpg files (*.jpg)|*.jpg|All files(*.*)|*.*";
if (dlg.ShowDialog() ==DialogResult.OK) { try{ dlg.CheckFileExists = true; pictureBox1.Image = new Bitmap(dlg.OpenFile());//载入用户指定的图片
pictureBox1.SizeMode = PictureBoxSizeMode.Zoom; //pictureBox1.SizeMode = PictureBoxSizeMode.AutoSize;
dlg.Dispose();//关闭dlg
processText.Text = "成功打开" + dlg.FileName; processText.Text += "pic width = " + pictureBox1.Image.Width; processText.Text += "; height = " + pictureBox1.Image.Height; processText.Show();
}catch (Exception exs) { processText.Text = "无法打开指定文件" + dlg.FileName + ",请勿指定非图片文件!"; processText.Show(); } } |
可以使用anchor 属性将控件相对于窗体的边缘固定到窗体上。.net 框架中的所有控件都支持Anchor属性,以实现这个效果。这个属性是AnchorStyles枚举来设置的。Anchor属性维护控件到它的容器的锚定边缘的距离。
我们可以把锚看成是一艘小艇用一根绳子固定到湖边的一个浮动码头上。湖会随着水面的涨落而改变大小,但小艇和浮动码头的距离也就是绳子的长度总是固定的。
和Anchor属性一样,Dock属性也使用枚举值,也就是DockStyle枚举。注意,AnchorStyles枚举是复数形式,因为一个控件可以具有多个锚定设置,但DockStyle枚举是单数形式,因为一个控件只有一个停靠处。
Dock属性除了具有Anchor属性具有的left、right、bottom、top、none属性外,还具有一个特殊的属性fill。它表示控件被停靠到容器的所有边缘。
.NET所提供的菜单类在.NET 2.0中进行了完全的重写。在.NET 1.x中,菜单类是基于Win32的菜单类,是由Menu类层次结构所支持的。MainMenu、ContextMenu和MenuItem类都是从Menu类派生的,支持Windows Form应用程序内部的Win32菜单和上下文菜单。犹豫兼容性的原因,.NET 2.0仍然支持并可以使用这些类,但它们已经不再是大多数应用程序优先使用的菜单机制。
新的、经过改进的菜单类基于ToolStrip和ToolStripItem类,这两个类是所有工具栏对象以及它们内部的项的积累。MenuStrip类是从ToolStrip类派生的,专门表示菜单。ToolStripMenuItem类是从ToolStripItem类派生的,表示菜单中的一个菜单项。
用户在控件上单击鼠标右键可以立即看到一个命令列表,这是一种功能强大的机制。经验丰富的用户尤其喜欢这个功能。
如何添加上下文菜单:
Step1:
在form中添加一个ContextMenuStrip对象。在“工具箱”的“菜单和工具栏”中。
Step2:
把这个新的上下文菜单与PictureBox控件(或其他你想要关联的对象)相关联。具体的方法是:
a) 显示该控件的属性窗口
b) 点击ContextMenuStrip项的右边
c) 从列表中选择想要关联的上下文菜单的名称
StatusStrip控件是直接从基类ToolStrip继承的。
从技术上说,状态条可以出现在任何父容器中,并可以停靠在容器的任何一边。但是,按照传统,状态条总是放在窗体对象的底部。
注意,生成状态条的界面与生成菜单的界面具有很大的不同。左边那个小小的、大部分为白色的图标用于添加ToolStrip StatusLabel对象,而图标右边的下拉箭头显示一个上下文菜单,用于把各种ToolStripItem对象添加到状态条中。
可以使用isLink方法,来把状态label变成连接,并且可以通过设置click事件处理方法来处理该事件。
this.processStatus.IsLink = true; |
效果截图:
当某个状态label太长而可能显示不完时,可以设置其ToolTipText属性,并且要记得把这个label所在的状态条的ShowItemToolTips属性设置为true。
在程序中直接定义要用的类是可行的。这种做法能够很好的实现目的,但很难让其他应用程序使用这些类。因此,我们把这些类放在类库时,使它们可以被其他程序所复用。在windows的世界里,这种类库称为动态链接库(DLL)。
步骤:
1.新建项目
2.visual c# -》类库
3.输入名称。完成。
1. 展开想的“属性”项
2. 双击Assembly.cs文件
3. 设置程序集和文件的版本属性,以及其他需要设置的属性
using System; using System.Collections.Generic; using System.Linq; using System.Text;
namespace Manning.MyPhotoAlbum { // public class Photograph { private string _fileName; private Bitmap _bitmap;
public Photograph(string fileName) { _fileName = fileName; _bitmap = null; }
public string FileName { get { return _fileName; } }
public Bitmap Image { get { if (_bitmap == null) { _bitmap = new Bitmap(_fileName); } return _bitmap; } }
} } |
在c#中,属性的创建方式与方法很相似。我们定义这个属性的访问级别、类型和名称。按照microsoft的约定,属性的名称以大写字母开头,并使用名词或名词短语。名词后面不带括号,告诉编译器这是个属性,而不是方法。
在花括号内部,定义了这个属性的访问符。访问符通过get关键字提供了读取访问,或者通过set关键字提供了写入访问。Get访问符必须返回这个属性的定义类型,而set访问符则使用保留字value来访问赋值号右边所赋的值。例如,如果我们想让Photograph类的用户设置FileName属性,可以使用下面的代码:
public string FileName { get { return _fileName; } set { _fileName = value; } } |
为了在c++中实现表示文件名成员的set和get功能,程序员一般提供像SetFileName和GetFileName这样的方法。在c#中,属性对这个概念进行了格式化,使所有的程序使用一种标准的机制来进行这种风格的访问。
属性的使用:
public bool HasChanged { get { return _hasChanged; } internal set { _hasChanged = value; } } public string Caption { get { return _caption; } set { if (_caption != value) { _caption = value; HasChanged = true; } } } |
在产品代码中为所有的public类成员(包括属性)提供三斜杠(///)文档式注释是个非常好的做法。Visual studio可以提取这些注释,供使用这个类库的其他程序员使用。因此,通过这种接口进行信息交流时一种非常好的方法。
示例:引用System.Drawing.dll类库
步骤:
1. 在“解决方案资源管理器”窗口中,在MyPhotoAlbum项目的上下文菜单中,右击“引用”,并选择“添加引用”
2. 在.NET选项卡中选择SystemDrawing.Dll项,并“确定”。
3. 在Photograph.cs文件的顶部,添加System.Drawing命名空间的using 命令。
public bool HasChanged { get { return _hasChanged; } internal set { _hasChanged = value; } } |
Internal关键字表示_hasChanged属性智能由MyPhotoAlbum程序集的成员才可以set。
默认的String.Equals方法执行大小写敏感的字符串比较。我们可以使用另一种形式的StringEquals方法,它接受一个StringComparison枚举值,表示应该怎样比较字符串。StringComparison.InvariantCultureIgnoreCase将执行文化不变性的比较,并且忽略大小写。
示例:
public overridebool Equals(object obj) { if (obj is Photograph) { Photograph p = (Photograph)obj; return (FileName.Equals(p.FileName,StringComparison.InvariantCultureIgnoreCase)); } return false; } |
文化不变性的概念:文化表示一种特定的语言或区域,例如美国英语或加拿大法语等。“当前文化”指当前系统的文化。文化不变性与英语相关联,但与国家或地区无关。我们在这里通过文化不变性获得和文化独立的比较结果。
类定义了一组操作,接口定义了类可以支持的一种操作。
接口定义了支持这个接口的类必须实现的属性、方法和事件。接口封装了一些共同概念,可以由不相关的类所使用。而抽象类虽然也封装了一些共同的概念,但它们一般由相关联的类所使用。
一些.NET集合类
类 |
描述 |
Array |
固定长度的数组。这个抽象类是.NET中所有简单数组的基类。 |
ArrayList |
一种动态长度的数组。 |
CollectionBase |
一个用于创建强类型集合的抽象类。 |
DataView |
一种自定义的数据库表的视图。 |
Hashtable |
一种存储基于散列码(称为键)的值的集合。 |
Queue |
FIFO队列。一种先进先出的对象集合。 |
SortedList |
一种键和值的有序集合,可以通过键和索引来访问。 |
StringCollection |
字符串对象集合。 |
Stack |
LIFO队列,一种后进先出的对象集合。 |
CollectionBase类是个抽象类,用于创建强类型的集合。如果一个类在它的方法中只允许一种或一些特定的类型,而不允许使用像object这样的通用类型,它就是强类型。强类型的类允许编译器保证传递给类的方法是适当的对象,以防止因为类型而导致的运行时错误。
从CollectionBase类派生是创建强类型集合的推荐方式。在.NET2.0之前,这是创建这种集合的最佳方法。在.NET2.0中,C#支持一种称为泛型的概念,可以提供更好的选择。
IDisposable接口
IDisposable接口表示一个对象可以被销毁。支持这个接口的对象实例在这个对象的最后一个引用被丢弃之前应该调用Dispose方法来释放系统资源。这个接口位于System命名空间。
公共方法 |
Dispose |
释放这个对象所使用的任何系统资源 |
创建OK消息框
string msg = String.Format("unable to open album file{0}\n({1})",fileName,exs.Message); MessageBox.Show(msg,"unable to open"); |
创建YESNO消息框
private void yesNoButt_Click(object sender, EventArgs e) { string msg = ""; msg = String.Format("you want to click {0} or {1}","yes", "no");
DialogResult result =MessageBox.Show(this, msg,"yes or no?", MessageBoxButtons.YesNoCancel,MessageBoxIcon.Question); if (result == DialogResult.Yes) { Console.WriteLine("client press Yes!!"); } } |
1. 在form上放上所需的ok、reset、cancel等按钮,并将各自的DialogResult设置为对应的值
2. 在分别设置form的属性如下:
属性 |
值 |
AcceptButton |
Form上Okbutton的名字 |
CancelButton |
Form上CancelButton的名字 |
FormBorderStyle |
FixedDialog |
MaximizeBox |
False |
MinimizeBox |
False |
ShowInTaskBar |
False |
文本掩码涉及到MaskedTextBox类。这个类基于Visual Basic 6 的类似控件,它保证控件所接收的是一种特定类型的输入。
MaskedTextBox控件的核心是Mask属性。这个属性定义了用户可以接收的输入长度和内容。掩码可以使控件禁止所有不符合预定义格式的输入。
在MSDN中输入“MaskedTextBox.Mask”可以查看mask属性的相关内容。
如果您在 MaskedTextBox 已包含前一个掩码筛选过的用户输入时更改掩码,MaskedTextBox会尝试将该输入迁移至新的掩码定义。如果失败,将清除现有的输入。为掩码赋予一个零长度的字符串会保留控件中现有的任何数据。当与零长度掩码一起使用时,MaskedTextBox的行为与单行 TextBox控件的类似。 小数点 (.)、千分位 (,)、时间 (:)、日期 (/) 和货币 ($) 符号默认为按照应用程序的区域性的定义显示这些符号。可以通过使用FormatProvider 属性强制这些符号显示为其他区域性的符号。 运行时掩码中的字符插入由InsertKeyMode 属性控制。用户可以通过使用左箭头和右箭头或鼠标指针在掩码中移动,或者可以通过输入空格跳过掩码中的可选位置。
下表显示了示例掩码。
|
1. 从“工具箱”-“公共控件”中,拖动ToolTip到窗体上。
2. 给新拖入得toolTip设置好名字
3. 在代码中使用myToolTip.setToolTip函数给tooltip设置内容。
PS:一个toolTip可以给一个窗体公用,只要设置setToolTip时,注意绑定的Control即可。
示例代码:
private void username_TextChanged(object sender, EventArgs e) { selfShow.Text = username.Text; tip1.SetToolTip(selfShow, username.Text);// selfShow为一个textBox的名字 tip1.SetToolTip(this,"in this form");//this是这个form的指针 } |
设置listBox为可多选
fileList.SelectionMode = SelectionMode.MultiExtended; |
为listBox添加项目
for(int i = 0; i < 15; i++){ fileList.Items.Add(String.Format("file{0}",i)); } |
读取listBox被选中的项目
System.Windows.Forms.ListBox.SelectedObjectCollection selectItems = fileList.SelectedItems; foreach (object itemin selectItems) { string path = item.ToString(); path = path.Substring(path.IndexOf('.')+1);//获得路径 PicForm p = openFile(path);//显示路径对应的图片 p.Show(); } |
1. 无法设置多选,但可以设置文本框是否可编辑。
this.comboBox1.DropDownStyle = ComboBoxStyle.DropDownList; |
2. 添加项目
for (int i = 0; i < 15; i++) { comboBox1.Items.Add(String.Format("file{0}", i)); } |
设置默认项
this.comboBox1.SelectedIndex = 0; |
3. 获取选中的项目
label1.Text = comboBox1.SelectedItem.ToString(); |
4. 自动完成(即,自动匹配文本)
要设置ComboBox的AutoCompleteMode属性置以及AutoCompleteSource属性 AutoCompleteMode允许有四种值:
None:默认值,指示ComboBox不使用自动功能。 Suggest:在ComboBox中输入字符后,ComboBox会自动展开,显示匹配的子项,输入行不受影响,需要自己输入后续字符,或者在下拉框中点选完整子项。 Append:输入字符后,字符后会自动补充匹配内容(以反色显示),但是ComboBox不会展开。按上下键可以在多个匹配内容中切换。 SuggestAppend:上述两种模式的组合。
AutoCompleteSource属性,共有9种,指示自动完成将要在其中进行查找的数据源。常用的几种如下:
ListItems:数据源为ComboBox的Item集合。 FileSystem:文件系统。例如输入c:\后会展开c:\下的目录列表(或append模式下的自动添加)。同样的,此数据源也支持文件名的补全。 CustomSource:自定义数据源。选用此方式时必须在代码中指定ComboBox的AutoCompleteCustomSource属性为你构建的AutoCompleteStringCollection对象,否则不会生效。AutoCompleteStringCollection类似于List
|
this.editable.AutoCompleteMode = AutoCompleteMode.SuggestAppend; this.editable.AutoCompleteSource = AutoCompleteSource.ListItems; |
FolderBrowserDialog fbd = new FolderBrowserDialog();
if (fbd.ShowDialog() ==DialogResult.OK) { folderPath = fbd.SelectedPath; string str = string.Format("当前路径:{0}", folderPath); statusStrip1.ShowItemToolTips = true; currentPath.Text = str; currentPath.ToolTipText = str;
//将文件列表添加到listBox控件中 string[] files = Directory.GetFiles(folderPath); int pos = 0; fileList.Items.Clear();//先清空之前的list列表 //添加新的列表 foreach(string filein files){ fileList.Items.Add(string.Format("{0}. {1}",++pos, file)); } } |
如何获得文件夹下的文件名称
/// ///根据文件夹的路径名,获得该文件夹下的所有文件的名称 /// Elar @ 2010.12.31 /// /// ///
private string[] getFiles(string path) { return Directory.GetFiles(path); } |