目录
委托(Delegate)
在C#编程语言中,委托(Delegate)是一种特殊的数据类型,用于存储方法的引用,它可以看做是函数指针的升级版。为了实现方法的参数化,提出了委托。委托是一种引用方法的类型,即委托是方法的引用,一旦为委托分配了方法,委托将于该方法具有完全相同的行为。委托的类型参数表示方法参数的类型,而返回类型表示方法返回值的类型。
1、用法
在委托对象的引用中存放的不是对数据的引用,而是存放对方法的引用,即在委托的内部包含一个指向某个方法的指针,可以指向多个具有相同签名的方法。通过使用委托把方法的引用封装在委托对象中,然后将委托对象传输给调用引用方法的代码。委托声明如下:
修饰符 delegate 返回类型 委托名称 (参数列表)
修饰符是可选项;
返回类型、关键字delegate和委托名称是必需项;
参数列表用来指定委托所匹配的方法的参数列表,是可选项。
(1)动态绑定:委托允许在运行时动态地选择要调用的方法,提高了代码的灵活性。
(2)事件处理:委托在事件驱动的编程模型中起到重要作用,例如 Windows Forms 和 WPF 应用程序。
(3)方法组合:委托可以用于将多个方法组合在一起,实现更复杂的逻辑。
(4)解耦:委托有助于实现模块间的解耦,降低代码之间的耦合度,提高程序的灵活性和可维护性。
2、与委托类型相匹配方法的条件
(1)二者具有相同的签名,即具有相同的参数数目,类型相同,顺序相同参数修饰符也相同。
(2)二者具有相同的返回值类型
3、委托的类结构
委托是方法类型安全的引用,为什么说委托是安全的,因为委托和其他所有的C#成员一样,是一种数据类型,并且任何委托对象都是System.Delegate的某个派生类的一个对象。委托的类结构如下:
自定义委托结构→System.MulticastDelegate→System.Delegate→SystemObjcet
得出:任何自定义委托类型都继承自System.Delegate类型,并且该类封装了许多委托的特性和方法。
4、创建和使用委托
(1)创建委托
① 使用'delegate'关键字定义委托类型 如:
public delegate int CalculateSquare(int num);
② 为委托添加方法 如:
public int SquareByPlus(int num)
{
return num + num;
}
和
public int SquareByMultiply(int num)
{
return num * num;
}
③ 创建委托实例,并将其绑定到方法上,如:
SquareDelegate squareDelegate = SquareByPlus;
(2)使用委托
① 将委托作为参数传递给其他方法,如:
CalculateSquare(squareDelegate);
② 在事件处理程序中,使用`+=`操作符将委托绑定到事件上,如
button1.Click += new EventHandler(ButtonClick);
5、常见委托类型
'Action':表示无返回值的方法,如:
action(() => Console.WriteLine("Hello, World!"))
'Func':表示有返回值的方法,如:
Func<int, int> func = (x) => x * 2
'Predicate':表示用于判断条件的方法,如:
bool predicate(int x) => x > 10
6、实例
首先,我们定义一个计算平方的委托:
public delegate int SquareDelegate(int num);
然后,我们编写两个计算平方的方法:public int SquareByPlus(int num) { return num + num; } public int SquareByMultiply(int num) { return num * num; }
接下来,我们可以创建一个方法,接受一个SquareDelegate类型的参数,然后根据这个委托来调用对应的方法:public static int CalculateSquare(SquareDelegate squareDelegate) { int num = Convert.ToInt32(Console.ReadLine()); return squareDelegate(num); }
在主程序中,我们可以创建一个SquareDelegate类型的变量,然后将计算平方的方法绑定到这个变量上:SquareDelegate squareDelegate = SquareByPlus;
最后,我们调用CalculateSquare方法,传入我们创建的squareDelegate变量,根据用户输入的数字计算其平方:int result = CalculateSquare(squareDelegate); Console.WriteLine("The square of the number is: " + result);
这个例子展示了如何使用委托动态地选择要调用的方法。这种编程技巧在事件处理、回调函数等方面有着广泛的应用。
总结一下,C#中的委托是一种灵活的处理事件的机制,它允许我们在运行时动态地绑定方法,从而实现更高效的代码组织和灵活的编程风格。通过使用委托,我们可以将方法作为参数传递给其他方法,实现方法组合和模块化,提高代码的可读性和可维护
控件
控件是用户界面(UI)的基本组成部分,它们允许用户与程序进行交互。
1、RichTextBox控件(格式文本框控件)
主要用于显示、输入和操作带有格式的文本,比如可以实现显示字体、颜色、链接、从文件加载文本及嵌入的图片、撤销和重复编辑操作,以及查找指定的字符等功能。
(1)创建RichTextBox控件
在 Visual Studio 中,可以通过拖拽 RichTextBox 控件到窗体上或者直接在代码中创建。
下面是在代码中创建 RichTextBox 控件的示例:
RichTextBox richTextBox1 = new RichTextBox();
richTextBox1.Dock = DockStyle.Fill;
Controls.Add(richTextBox1);
(2)设置 RichTextBox 的属性
常用属性:
Text:设置或获取RichTextBox控件中的文本内容。
Font:设置或获取RichTextBox控件中文本的字体样式。
ForeColor和BackColor:设置或获取RichTextBox控件中文本的前景色和背景色。
ReadOnly:设置或获取RichTextBox控件是否为只读模式,即禁止用户编辑文本。
Multiline:设置或获取RichTextBox控件是否允许多行文本,默认为true。
ScrollBars:设置或获取RichTextBox控件中的滚动条样式,包括水平和垂直滚动条。
WordWrap:设置或获取RichTextBox控件中的文本是否自动换行,默认为true。
Modified:设置或获取RichTextBox控件中的文本内容是否已被修改。
// 设置 RichTextBox 的文本内容
richTextBox1.Text = "Hello, World!";
// 设置 RichTextBox 的字体和字号
richTextBox1.Font = new Font("Arial", 12);
richTextBox1.FontSize = 12;
// 设置 RichTextBox 的文本颜色
richTextBox1.ForeColor = Color.Black;
// 设置 RichTextBox 的背景色
richTextBox1.BackColor = Color.White;
// 设置 RichTextBox 的滚动条样式
richTextBox1.ScrollBars = ScrollBars.Vertical;
(3)处理 RichTextBox 的事件
常用事件:
TextChanged:当RichTextBox控件中的文本内容发生改变时,触发该事件。
SelectionChangeCommitted:当RichTextBox控件中选中的文本发生改变时,触发该事件。
MouseClick:当RichTextBox控件被鼠标点击时,触发该事件。
KeyPress:当RichTextBox控件被按下键盘上的键时,触发该事件。
private void richTextBox1_TextChanged(object sender, EventArgs e)
{
// 处理文本改变事件,例如限制最大字符数
richTextBox1.Text = richTextBox1.Text.Substring(0, 100); // 限制最大字符数为 100 个
}
(4)使用方法对文本进行操作
常用方法:
Clear():清除RichTextBox控件中用户输入的所有内容。
Copy()、Cut()、Paste():实现RichTextBox控件的剪贴板功能。
SelectAll():选中控件中的所有文本。
Find():实现查找功能。
SaveFile()、LoadFile():保存文本和打开文件。
Undo()、Redo():撤销上一次编辑操作、重做上次撤销的编辑操作。
Select():在RichTextBox控件中选择文本,可以选择一个单词或者一个句子等。
ScrollToCaret():将RichTextBox控件的滚动条滚动到光标位置。
SelectNone():取消在RichTextBox控件中的选择文本。
以下是一个将选中的文本颜色改为红色的示例:
private void richTextBox1_MouseClick(object sender, MouseEventArgs e)
{
// 在鼠标点击时选中文本,并将选中的文本颜色改为红色
richTextBox1.Focus(); // 获取焦点,确保可以选中文本
richTextBox1.Selection.Select(0, 10); // 选中前 10 个字符,也可以用鼠标拖动选中部分文本
richTextBox1.SelectionColor = Color.Red; // 将选中的文本颜色改为红色
}
2、ListView控件(列表视图控件)
主要用于显示带图标的项列表,其中可以显示大图标、小图标和数据。使用LstView控件可以创建类似Windows资源管理器右边窗口的用户界面。
(1)创建ListView控件
在Visual Studio中,可以通过拖拽ListView控件到窗体上或者直接在代码中创建。下面是在代码中创建ListView控件的示例:
ListView listView1 = new ListView();
listView1.Dock = DockStyle.Fill;
Controls.Add(listView1);
(2)设置ListView的属性
Items:获取或设置ListView控件中的项目内容,可以通过Add()方法添加项目。
View:设置ListView控件的视图模式,包括大图标、小图标、列表、详细信息等。
FullRowSelect:设置是否选择整行项目。
MultiSelect:设置是否支持多选项目。
Sorting:设置是否启用自动排序功能。
LargeImageList:设置大图标对应的ImageList对象。
SmallImageList:设置小图标对应的ImageList对象。
ColumnHeaderToolTips:设置ListView控件的列头工具提示。
SelectionMode:设置ListView控件的选择模式,包括单选、多选等。
AutoGenerateColumns:设置是否自动生成列头,默认为false。
(3)处理ListView的事件
常用事件:
ItemClick:当用户单击ListView控件中的项目时触发该事件。
ItemDoubleClick:当用户双击ListView控件中的项目时触发该事件。
ItemSelectionChanged:当ListView控件中的项目选中状态发生改变时触发该事件。
ColumnHeaderClick:当用户单击ListView控件的列头时触发该事件。
ColumnHeaderDoubleClick:当用户双击ListView控件的列头时触发该事件。
以下是一个处理ItemSelectionChanged事件的示例:
private void listView1_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)
{
// 处理项目选中事件,例如选中多个项目
if (listView1.SelectedItems.Count > 0)
{
// 选中多个项目,可以通过循环遍历SelectedItems属性来操作选中状态
ListViewItem.ListViewSubItem[] subItems = listView1.GetSelectedItems();
foreach (ListViewItem.ListViewSubItem subItem in subItems)
{
// 对选中项目进行操作,例如修改文本颜色或字体样式等
subItem.Font = new Font(subItem.Font.FontFamily, subItem.Font.Size, FontStyle.Bold);
}
}
}
(4)常用方法
Add():添加项目到ListView控件中。
Remove():从ListView控件中移除指定项目。
Clear():清除ListView控件中的所有项目。
Refresh():刷新ListView控件,重新加载数据。
Sort():按照指定的排序规则对ListView控件中的项目进行排序。
Find():查找ListView控件中包含指定文本的项目。
Select():选中ListView控件中的指定项目。
Deselect():取消选中ListView控件中的指定项目。
Focus():将焦点移动到ListView控件中的指定项目。
EnsureVisible():确保指定的项目在ListView控件中可见。
3、Timer控件
Timer控件是一种用于在Windows窗体中定时触发事件的控件,它通过引发Timer事件来执行指定的操作。
(1)创建Timer控件
在Visual Studio中,可以通过拖拽Timer控件到窗体上或者直接在代码中创建。
(2)设置Timer控件属性
常用属性:
Interval:这是Timer控件最重要的属性,它决定了Timer事件多长时间被触发一次。Interval的默认值是0,这表示事件将不会被触发。如果Interval的值小于或等于0,那么Timer将不会运行。
Enabled:这个属性决定了Timer控件是否开始计时。如果Enabled的值为true,那么Timer会开始计时;如果Enabled的值为false,那么Timer会停止计时。
AutoReset:这个属性决定了每次触发Timer事件后,Timer是否会重新开始计时。如果AutoReset的值为true,那么每次触发事件后,Timer会重新开始计时;如果AutoReset的值为false,那么Timer只会触发一次。
timer1.Interval = 3600000; // 设置计时器间隔时间为360秒(1小时)
timer1.Enabled = true; // 启动计时器
(3)处理Timer事件
Timer控件的一个重要事件是Tick事件,每当计时器间隔时间到达时,就会触发一次Tick事件。可以通过为Tick事件添加事件处理程序来执行相应的操作。
private void timer1_Tick(object sender, EventArgs e)
{
MessageBox.Show("时间到"); // 在弹出窗口中显示"时间到"文字
}
你可以通过以下方式使用Timer控件:首先,在Visual Studio的设计视图中,从工具箱里拖一个Timer控件到你的窗体上。然后,你可以设置它的Interval和其它属性。最后,你可以为Tick事件添加一个事件处理程序来定义每次触发事件时应该发生什么。例如:
private void timer1_Tick(object sender, EventArgs e)
{
// 这里写你的代码,每当timer1的间隔到达时,这段代码就会被执行
}
(4)使用方法
Start():这个方法会启动Timer控件。
Stop():这个方法会停止Timer控件的运行。
Invoke():这个方法会触发一个Timer事件。
timer1.Stop(); // 停止计时器
timer1.Start(); // 启动计时器
需要注意的是,Timer控件是为单线程环境设计的,它只能在UI线程中运行,不能在后台线程中运行。此外,Timer控件的Tick事件只能用于周期性触发,不能用于响应其他操作或用户输入。如果需要在其他操作或用户输入时执行特定的代码,需要使用其他控件或事件处理程序来实现。在使用Timer控件时,需要注意的是它是在UI线程中运行的,因此它可能会阻塞UI线程,导致界面无响应。