c#编程教程-用c编写高级winforms#

在本C#编程教程中,我将重点介绍高级控件,如组合框、网格和列表视图,并向您展示最有可能使用它们的方式。在以后的教程中,我不会涉及数据和绑定。让我们从一个简单的控件开始,一个组合框。...

01

在winforms中使用控件-高级

WinForm with ComboBox

在本C#编程教程中,我将重点介绍高级控件,如组合框、网格和列表视图,并向您展示最有可能使用它们的方式。在以后的教程中,我不会涉及数据和绑定。让我们从一个简单的控件开始,一个组合框。

组合框winform控件

组合的核心是项目集合,最简单的填充方法是在屏幕上放置一个组合,选择属性(如果看不到属性窗口,请单击顶部菜单上的视图,然后单击属性窗口),查找项目并单击省略号按钮。然后,您可以键入字符串,编译程序并下拉组合以查看选项。

现在停止程序,再添加几个数字:4,5。。最多十个。当您运行它时,您将只看到8,因为这是MaxDropDownItems的默认值。您可以随意将其设置为20或3,然后运行它以查看其功能。

令人恼火的是,当它打开时显示comboBox1,您可以编辑它。这不是我们想要的。找到DropDownStyle属性并将DropDown更改为DropDownList。(这是一个组合!)。现在没有文本,也不可编辑。您可以选择其中一个数字,但它始终为空。我们如何选择一个数字开始?这不是一个可以在设计时设置的属性,但是添加这一行就可以了。

combobox1.selectedindex=0;

在Form1()构造函数中添加该行。您必须查看表单的代码(在解决方案资源管理器中,右键单击From1.cs并单击查看代码。查找InitializeComponent();然后立即在此之后添加该行)。

如果您将组合的DropDownStyle属性设置为Simple并运行该程序,您将一无所获。它不会选择、单击或响应。为什么?因为在设计时,您必须抓住较低的拉伸手柄,使整个控件更高。

源代码示例

  • 下载示例(邮政编码)

在下一页:Winforms组合框继续

02

继续查看组合框

Working with a ComboBox

在示例2中,我将ComboBox重命名为combo,将combo DropDownStyle更改为DropDown,以便可以对其进行编辑并添加一个名为btnAdd的添加按钮。我双击add按钮创建了一个事件btnAdd_Click()事件处理程序,并添加了此事件行。

private void btnAdd_Click(object sender, System.EventArgs e) { combo.items.add(combo.text); }

现在当你运行这个程序时,输入一个新的数字,比如说11,然后点击add。事件处理程序接收您键入的文本(在combo.text中),并将其添加到combo的items集合中。点击组合,我们现在有一个新的条目11。这就是向组合添加新字符串的方式。删除一个字符串稍微复杂一些,因为您必须找到要删除的字符串的索引,然后删除它。下面显示的方法RemoveAt是一个用于执行此操作的集合方法。您只需在Removeindex参数中指定哪个项。

combo.items.removeat(removeindex);

将移除位置RemoveIndex处的字符串。如果组合中有n个项目,则有效值为0到n-1。对于10个项目,值为0..9。

在btnRemove_Click方法中,它使用

int removeindex=combo.findstringexact(removetext);

如果找不到返回的文本-1,则返回组合列表中基于0的字符串索引。FindStringExact还有一个重载方法,允许您指定从何处开始搜索,因此如果有重复项,可以跳过第一个等。这对于删除列表中的重复项非常方便。

单击btnAddMany_Click()清除combo中的文本,然后清除combo项目集合的内容,然后调用combo.AddRange(从值数组中添加字符串。执行此操作后,将组合的SelectedIndex设置为0。这将显示组合中的第一个元素。如果要在组合框中添加或删除项目,则最好跟踪所选项目。将SelectedIndex设置为-1将隐藏所选项目。

“添加批次”按钮清除列表并添加10000个编号。我在循环中添加了combo.BeginUpdate()和combo,EndUpdate()调用,以防止Windows试图更新控件时出现任何闪烁。在我有三年历史的电脑上,向组合中添加100000个数字只需一秒钟。

在下一页上查看ListView

03

在c#winforms中使用ListView

The sample ListView and controls

这是一个方便的控件,用于显示表格数据,而不需要网格的复杂性。您可以将项目显示为大图标或小图标、垂直列表中的图标列表或最有用的网格中的项目和子项目列表,这就是我们在这里要做的。

在窗体上删除ListView后,单击columns属性并添加4列。这些将是TownName、X、Y和Pop。设置每个列标题的文本。如果在ListView上看不到标题(在添加了所有4个标题之后),请将ListView的View属性设置为Details。如果查看此示例的代码,请向下浏览到显示Windows窗体设计器代码的位置,并展开您看到创建ListView的代码的区域。了解系统如何工作非常有用,您可以复制此代码并自己使用。

通过将光标移动到标题上并拖动它,可以手动设置每列的宽度。也可以在展开表单设计器区域后的可见代码中执行此操作。您应该看到如下代码:

对于“填充”列,代码中的更改将反映在设计器中,反之亦然。请注意,即使将Locked属性设置为true,这也只会影响设计器,并且在运行时可以调整列的大小。

ListView还附带许多动态属性。单击(动态属性)并勾选所需的属性。当您将属性设置为动态时,它将创建一个XML.config文件并将其添加到解决方案资源管理器中。

在设计时进行更改是一回事,但我们确实需要在程序运行时进行更改。ListView由0个或多个项目组成。每个项(ListViewItem)都有一个文本属性和一个子项集合。第一列显示项目文本,下一列显示子项目[0]。文本,然后是子项目[1]。文本,依此类推。

我添加了一个按钮来添加一行和城镇名称的编辑框。在框中输入任意名称,然后单击“添加行”。这会在ListView中添加一个新行,城镇名称放在第一列,接下来的三列(子项[0..2])将通过添加这些字符串来填充随机数(转换为字符串)。

Random R= new Random() ; listviewitem lvi=list.items.add(tbname.text); lvi.subitems.add(r.next(100.tostring());//0..99 添加(r.next(100.tostring()); lvi.subitems.add((10+r.next(10))*50.tostring());

在下一页:更新ListView

04

以编程方式更新listview

Right Clicking the ListView control

默认情况下,创建ListViewItem时,它有0个子项,因此必须添加这些子项。因此,不仅需要将ListItems添加到ListView,还需要将ListItem.SubItems添加到ListItem。

以编程方式删除listview项

现在将ListView Multiselect属性设置为false。我们只希望一次选择一个项目,但如果您希望一次删除更多项目,则类似,只是您必须反向循环。(如果按正常顺序循环并删除项目,则后续项目与所选索引不同步)。

右键单击菜单还不能工作,因为我们没有菜单项显示在它上面。因此,右键单击PopupMenu(表单下方),您将看到上下文菜单出现在表单顶部的普通菜单编辑器出现的位置。单击它,然后在显示“在此处键入”的位置键入“删除项”。“属性”窗口将显示一个菜单项,以便将其重命名为mniRemove。双击此菜单项,您将获得menuItem1\u click事件处理程序代码函数。添加此代码,使其看起来像这样。

如果看不到删除项,只需在表单设计器中单击表单下的PopupMenu控件即可。这将使它重新进入人们的视野。

private void menuItem1_Click(object sender, System.EventArgs e) { listviewitem l=列表。选择编辑项[0]; 如果(l!=null) { 列表。项目。删除(l); } }

但是,如果您运行它并且没有添加项目并选择它,当您右键单击并获得菜单并单击“删除项目”时,它将给出一个异常,因为没有选择的项目。这是一个糟糕的编程,下面是如何修复它的。双击弹出事件并添加这行代码。

private void PopupMenu_Popup(object sender, System.EventArgs e) { mniremove.enabled=(list.selecteditems.count>0); }

它仅在存在选定行时启用“删除项”菜单项。

在下一页

:使用DataGridView

05

如何使用datagridview

The Sample DataGridView and other controls

DataGridView是C#免费提供的最复杂和最有用的组件。它既可以使用数据源(即来自数据库的数据),也可以不使用数据源(即以编程方式添加的数据)。在本教程的其余部分,我将演示如何在没有数据源的情况下使用它,对于更简单的显示需求,您可能会发现普通的ListView更合适。

datagridview可以做什么?

如果您使用的是较旧的DataGrid控件,那么这只是其中的一种:它提供了更多的内置列类型,可以处理内部和外部数据,更多的显示(和事件)自定义,并提供了更多的单元格处理控制,冻结行和列。

使用网格数据设计表单时,通常会指定不同的列类型。您可能在一列中有复选框,在另一列中有只读或可编辑文本,以及课程编号。这些列类型通常也会以不同的方式与数字对齐,通常是右对齐的,因此小数点会对齐。在列级别,您可以从按钮、复选框、组合框、图像、文本框和链接中进行选择。如果这些还不够,您可以自定义类型。

添加列的最简单方法是在IDE中进行设计。正如我们之前所看到的,这只是为您编写代码,当您完成了几次之后,您可能更愿意自己添加代码。一旦你做了几次,它就为你提供了如何以编程方式做这件事的见解。

让我们从添加一些列开始,在表单上放置一个DataGridView,然后单击右上角的小箭头。然后单击添加列。这样做三次。它将弹出一个“添加列”对话框,您可以在其中设置列的名称、列顶部显示的文本并选择其类型。第一列是YourName,它是默认的文本框(dataGridViewTextBoxColumn)。将标题文本也设置为yourname。将第二列设为Age并使用组合框。第三列是允许的,是复选框列。

在添加所有三个之后,您应该看到中间列一个(年龄)和一个在允许列中的复选框的三列的组合。如果单击DataGridView,则应在属性检查器中找到列并单击(集合)。这会弹出一个对话框,您可以在其中设置每列的属性,例如单个单元格颜色、工具提示文本、宽度、最小宽度等。如果编译并运行,您会注意到您可以更改列宽和运行时。在主DataGridView的属性检查器中,可以将AllowUser to resizeColumns设置为false,以防止出现这种情况。

在下一页:

向DataGridView添加行

06

以编程方式向datagridview添加行

Setting the Event Handler for the Leave event

我们将在代码中向DataGridView控件添加行,示例文件中的ex3.cs包含此代码。首先,将文本编辑框、组合框和按钮添加到带有DataGridView的表单中。将DataGridView属性AllowUserToAddRows设置为false。我也使用标签,称为组合框cbAges、按钮btnAddRow和文本框tbName。我还为表单添加了一个关闭按钮,并双击它以生成btnClose_Click事件处理程序框架。在那里添加Close()一词可以实现这一点。

默认情况下,“添加行按钮启用”属性在开始时设置为false。我们不想向DataGridView添加任何行,除非名称文本编辑框和组合框中都有文本。我创建了CheckAddButton方法,然后在显示事件时双击属性中单词Leave旁边的单词,为Name文本编辑框生成了一个Leave事件处理程序。属性框在上图中显示了这一点。默认情况下,“属性”框显示属性,但单击lightning按钮可以查看事件处理程序。

private void CheckAddButton() { btnaddrow.enabled=(tbname.text.length>0&&cbages.text.length>0); }

您可以改为使用TextChanged事件,但这将为每个按键调用CheckAddButton()方法,而不是在控件离开时,即当另一个控件获得焦点时。在Ages组合框中,我使用了TextChanged事件,但选择了tbName_Leave事件处理程序,而不是双击来创建新的事件处理程序。

并非所有事件都兼容,因为某些事件提供了额外的参数,但如果您可以看到以前生成的处理程序,则可以使用它。这主要是一个偏好问题,您可以为正在使用的每个控件使用单独的事件处理程序,或者共享事件处理程序(如我所做的),如果它们具有公共事件签名,即参数相同。

为了简洁起见,我将DataGridView组件重命名为dGView,并双击AddRow以生成事件处理程序框架。下面的代码添加一个新的空行,获取该行索引(刚才添加的是RowCount-1,RowCount基于0),然后通过其索引访问该行,并在该行的单元格中为YourName和Age列设置值。

dGView.Rows.Add() ; int rowindex=dgview.rowcount-1; datagridviewrow r=dgview.rows[rowindex]; r、 单元格[“yourname”].value=tbname.text; r、 单元格[“age”]。值=cbages.text;

在下一页:容器控件

07

使用带有控件的容器

Overlapping Panel and GroupBox

在设计表单时,您应该考虑容器和控件,以及哪些控件组应该放在一起。不管怎样,在西方文化中,人们从左上角到右下角阅读,这样更容易阅读。

容器是可以包含其他控件的任何控件。在工具箱中可以找到的包括面板、FlowLayoutpanel、SplitContainer、TabControl和TableLayoutPanel。如果看不到工具箱,请使用“视图”菜单,您将找到它。容器将控件固定在一起,如果移动或调整容器大小,将影响控件的位置。只需在表单设计器中将控件移到容器上,它就会识别出容器现在负责。

面板和分组框

面板类似于GroupBox,但GroupBox不能滚动,但可以显示标题,默认情况下有边框。面板可以有边框,但默认情况下没有边框。我使用GroupBox是因为它们看起来更漂亮,这一点很重要,因为:

  • Bolton定律-用户通常会对有缺陷的漂亮软件的评分高于没有缺陷的普通软件!

面板也可以方便地对容器进行分组,因此一个面板上可能有两个或多个GroupBox。

以下是使用容器的提示。在窗体上放置拆分容器。单击左侧面板,然后单击右侧面板。现在尝试从表单中删除SplitContainer。在右键单击其中一个面板,然后单击选择SplitContainer1之前,这是很困难的。一旦全部选中,您就可以删除它。另一种适用于所有控件和容器的方法是按Esc键选择父控件。

容器也可以相互嵌套。只需将一个小的拖到一个大的上面,你就会看到一条很短的垂直线,显示一个在另一个里面。拖动父容器时,子容器将随之移动。示例5显示了这一点。默认情况下,浅棕色面板不在容器内,因此当您单击“移动”按钮时,GroupBox会移动,但面板不会移动。现在将面板拖动到GroupBox上,使其完全位于GroupBox内。这次编译和运行时,单击“移动”按钮可同时移动这两者。

在下一页:使用TableLayoutPanels

08

使用tablelayoutpanels

Using a TableLayoutPanel

TableLayoutpanel是一个有趣的容器。它是一个表格结构,组织起来像一个二维网格,每个单元格只包含一个控件。一个单元格中不能有多个控件。您可以指定当添加更多控件时表的增长方式,或者即使它没有增长,也可以指定它似乎是以HTML表为模型的,因为单元格可以跨列或跨行。甚至容器中子控件的锚定行为也取决于边距和填充设置。我们将在下一页看到更多关于锚的信息。

在示例Ex6.cs中,我从一个基本的两列表格开始,并通过“控件和行样式”对话框指定(选择控件并单击位于右上角附近的小直角三角形以查看任务列表,然后单击最后一个),左栏为宽度的40%,右栏为宽度的60%。它允许您以绝对像素值、百分比指定列宽,也可以让它自动调整大小。访问此对话框的更快方法是在“属性”窗口中单击列旁边的集合。

我添加了一个AddRow按钮,并将GrowthStyle属性保留为默认的AddRows值。当表满时,它会添加另一行。或者,您可以将其值设置为AddColumns和FixedSize,使其不再增长。在Ex6中,当您单击AddControls按钮时,它调用AddLabel()方法三次,调用AddCheckBox()一次。每个方法都创建一个控件实例,然后调用tblPanel.Controls.Add(),在添加第二个控件后,第三个控件会导致表增长。单击“添加控制”按钮一次后,图中显示了它。

如果您想知道我调用的AddCheckbox()和AddLabel()方法中的默认值来自何处,那么控件最初是在设计器中手动添加到表中的,然后创建和初始化它的代码是从该区域中复制的。单击下面区域左侧的+后,您将在InitializeComponent方法调用中找到初始化代码:

windows窗体设计器生成的代码

下一页:您应该知道的一些常见属性

09

您应该知道的常用控件属性

Using Anchors

通过在选择第二个和后续控件(甚至是不同类型的控件)时按住shift键,可以同时选择多个控件。“属性”窗口仅显示两者共有的属性,因此您可以将它们全部设置为相同的大小、颜色和文本字段等。甚至可以将相同的事件处理程序分配给多个控件。

锚高

根据使用情况,某些表单最终往往会被用户调整大小。没有什么比调整窗体大小并看到控件保持在相同位置更糟糕的了。所有控件都有锚定,可以将它们“附着”到4条边,以便在移动附着的边时控件移动或拉伸。当从右边缘拉伸形状时,这将导致以下行为:

  1. 控件连接到左侧,但不是右侧。-它不会移动或伸展(糟糕!)
  2. 控件同时附着到左边缘和右边缘。当窗体拉伸时,它会拉伸。
  3. 控件附加到右边缘。它在拉伸形状时移动。

对于传统上位于右下角的关闭按钮,需要的是行为3。如果列数足以使表单溢出并且需要滚动,则ListView和DataGridView最好使用2)。顶部和左侧锚定为默认值。属性窗口包括一个漂亮的小编辑器,看起来像英格兰国旗。只需单击任意条(两个水平条和两个垂直条)即可设置或清除相应的锚定,如上图所示。

跟踪

一个没有得到太多提及的属性是Tag属性,但是它非常有用。在“属性”窗口中,只能指定文本,但在代码中,可以具有从对象派生的任何值。

我使用标记来保存整个对象,同时在ListView中仅显示其一些属性。例如,您可能只希望在客户摘要列表中显示客户名称和编号。但右键单击所选客户,然后打开一个包含所有客户详细信息的表单。如果您通过读取内存中所有客户的详细信息并在标记中指定对客户类对象的引用来建立客户列表,那么这很容易。所有控件都有一个标记。

在下一页:

如何使用选项卡控件

10

使用选项卡控件

Tbe Two Tabs TabControl

TabControl是一种通过具有多个选项卡来节省表单空间的简便方法。每个选项卡都可以有一个图标或文本,您可以选择任何选项卡并显示其控件。TabControl是一个容器,但它只包含TabPages。每个选项卡页也是一个容器,可以添加普通控件。

在示例x7.cs中,我创建了一个两个选项卡的页面面板,第一个选项卡名为Controls,上面有三个按钮和一个复选框。第二个选项卡页面标记为Logs,用于显示所有记录的操作,包括单击按钮或切换复选框。调用一个名为Log()的方法来记录每次按钮单击等操作。它将提供的字符串添加到列表框中。

我还以通常的方式向TabControl添加了两个右键单击弹出菜单项。首先将ContextMenuStrip添加到表单中,并在TabControl的ContextStripMenu属性中进行设置。两个菜单选项是“添加新页面”和“删除此页面”。但是,我限制了页面删除,因此只能删除新添加的选项卡页面,而不能删除原来的两个选项卡页面。

添加新选项卡页

这很简单,只需创建一个新的选项卡页面,给它一个选项卡的文本标题,然后将其添加到Tabs控件的TabPages集合中

TabPage newPage = new TabPage(); newpage.text=“新建页面”; tabs.tabpages.add(新建页面);

在ex7.cs代码中,我还创建了一个标签并将其添加到选项卡页面。通过在表单设计器中添加代码来创建代码,然后复制代码,从而获得代码。

删除页面只需调用TabPages.RemoveAt(),使用Tabs.SelectedIndex获取当前选定的选项卡。

结论

在本教程中,我们了解了一些更复杂的控件是如何工作的,以及如何使用它们。在下一个教程中,我将继续使用GUI主题,查看后台工作线程并演示如何使用它。

  • 发表于 2021-10-01 18:39
  • 阅读 ( 172 )
  • 分类:编程

你可能感兴趣的文章

python(python)和c语言(c language)的区别

python(python)和c语言(c language)的区别 编程语言允许人类为计算机创建一组有意义的指令来执行任务。Python和C是两种高级编程语言。Python和C语言的关键区别在于Python是一种多范式语言,C是一种结构化编程语言。本文讨论了每种...

  • 发布于 2020-10-24 05:03
  • 阅读 ( 298 )

寻找最好的编程语言?从这里开始!

无论你是一个编程新手还是一个从未接触过的编程新手,最重要的问题是:“哪种编程语言适合我?” ...

  • 发布于 2021-03-12 12:24
  • 阅读 ( 297 )

为什么c编程仍然值得学习

... 你可能听说过C是一种“低级语言”,在编程的上下文中,“级别”是对你与计算机本机指令集的接近程度的描述。级别越低,就越接近于编写机器代码。级别越高,语言所做的抽象就越多,从而使您远离编写机...

  • 发布于 2021-03-13 03:02
  • 阅读 ( 309 )

用unity编写游戏:初学者指南

...可视化的编辑器来操作游戏环境,但Unity并不是一个“零编程”的游戏创建者工具。它要求你通过编程来产生结果,但同时也给了你一个比任何“游戏**者”程序都要灵活和强大得多的工具。 ...

  • 发布于 2021-03-13 11:55
  • 阅读 ( 233 )

9个最好的代码游戏,以建立你的编程技能

一旦你知道你在做什么,编程是很有趣的,但达到这一点可能是一个艰苦的旅程。 ...

  • 发布于 2021-03-17 21:19
  • 阅读 ( 440 )

适合初学者的最佳unity 3d教程

...多个平台上创建游戏的强大引擎。当Unity编辑器运行在C#编程语言上时,甚至可以不用编码来开发游戏。 ...

  • 发布于 2021-03-21 15:28
  • 阅读 ( 331 )

7统一游戏开发语言学习:哪种最好?

...何一个从Unity开始学习的人,或者任何一个有过面向对象编程知识的人来说,C语言是学习Unity的正确语言。事实上,C语言是平台上唯一值得学习的语言,这是有充分理由的。 ...

  • 发布于 2021-03-21 18:18
  • 阅读 ( 253 )

学习c#编程的7个实际原因

选择要学习的编程语言可能很难。不同的语言擅长不同的事情,有一个既定的目标可以让事情变得更容易。如果你想学编程,但又不确定该走什么样的职业道路呢? ...

  • 发布于 2021-03-21 18:41
  • 阅读 ( 376 )

为什么python不是适合您的编程语言

Python是近年来最流行的编程语言之一。它清晰的语法和可读性使它成为初学者的完美编码语言。考虑到Python的广泛使用,认为学习Python是必要的是可以原谅的。 ...

  • 发布于 2021-03-23 11:47
  • 阅读 ( 351 )

最流行的编程语言基于作业、搜索引擎等

没有规则规定你必须学习最流行的编程语言,但是如果你想以编写代码为生,了解需求和趋势可能是有益的。在ZDNet,计算机科学家、讲师、记者和作家davidgewirtz,在决定最流行的编程语言以及它的实际含义时,尝试了一下。使...

  • 发布于 2021-05-16 11:33
  • 阅读 ( 152 )
pfzo710
pfzo710

0 篇文章

相关推荐