当前位置: 首页 > news >正文

技术周总结 09.09~09.15周日(C# WinForm WPF)

文章目录

  • 一、09.09 周一
    • 1.1) 问题01: Windows桌面开发中,WPF和WinForm的区别和联系?
      • 联系:
      • 区别:
  • 二、09.12 周四
    • 2.1)问题01:visual studio的相关快捷键有哪些?
      • 通用快捷键
      • 编辑
      • 导航
      • 调试
      • 窗口管理
    • 2.2)问题02: public partial class ChoosePLReason : CommonBaseForm
    • 2.3)问题03:介绍Windows Forms中的 System.Windows.Forms.DataGridViewRowCollection
      • 常用属性:
      • 常用方法:
      • 示例代码
    • 2.4) 问题04: 介绍下 C#中的 `DataGridView` 控件
      • 主要特性
      • 基本用法
      • 注意事项
    • 2.5)问题05:Windows 窗体应用程序 中有哪些常见的概念,类和控件等
      • 常见概念
      • 常见类
      • 常见控件
      • 事件
      • 布局控件
    • 2.6) 问题06:WPF 中有哪些常见的概念,类和控件等
      • 常见概念
      • 常见类
      • 常见控件
      • 数据绑定相关类
      • 资源和样式相关类
  • 三、09.13 周五
    • 3.1)问题01: git怎么查询本地有哪些 commit没有 push到远端?
  • 四、09.14 周六
    • 4.1)问题01:C#代码中的 dll文件
      • 创建DLL文件
      • 使用DLL文件
      • 示例
    • 4.2) 问题02: C#中的注解(特性)
    • 4.3) 问题03:AssemblyInfo.cs文件 [assembly: AssemblyTitle("MyCode.Entity")]
    • 4.4)问题04:C#中 using 块语句
    • 4.5)问题05:WinForm中的 Form类的使用
      • 1. 创建一个基本的Form
      • 2. 添加控件
      • 3. 处理事件
      • 4. 显示和关闭窗口
      • 5. 设置窗口属性
      • 总结

一、09.09 周一

1.1) 问题01: Windows桌面开发中,WPF和WinForm的区别和联系?

WPF (Windows Presentation Foundation) 和 WinForms (Windows Forms) 都是用于开发Windows桌面应用程序的技术栈,但是它们之间存在一些重要的区别和联系:

联系:

  • 目标平台:两者都是.NET框架的一部分,旨在为开发者提供创建图形用户界面(GUI)的方式。
  • 编程语言:都可以使用C#或者VB.NET等.NET支持的语言进行开发。
  • IDE支持:Visual Studio提供了对这两种技术的集成设计支持。

区别:

  • 显示技术:WPF使用矢量图形和DirectX进行渲染,而WinForms则依赖于GDI+(Graphics Device Interface Plus)。这意味着WPF可以提供更高质量的图像,并且更容易处理复杂的视觉效果。
  • XAML:WPF引入了XAML(可扩展应用程序标记语言),这是一种XML衍生的语言,用来定义和链接用户界面及其组件。WinForms使用的是基于二进制的形式来保存窗体布局。
  • 数据绑定:虽然两者都支持数据绑定,但是WPF的数据绑定机制更为强大,支持双向绑定,以及更复杂的绑定表达式。
  • 动画与媒体:WPF内置了对动画、音频和视频的强大支持,而这些在WinForms中需要额外的工作才能实现。
  • 灵活性:WPF允许开发者创建高度定制化的控件,提供了更灵活的布局模型,而WinForms在这方面相对较为传统和固定。
  • 多平台支持:WPF最初仅限于Windows平台,但随着.NET Core和.NET 5及更高版本的发展,WPF也获得了跨平台的能力。WinForms同样受益于.NET Core的跨平台特性,但其主要设计目标仍然是Windows操作系统。

总的来说,WPF是一个更为现代的选择,尤其是在需要复杂UI设计的应用程序中。WinForms则因其简单易用,在构建基本的业务应用程序方面仍然非常受欢迎。选择哪一个取决于具体项目的需求和个人偏好。

二、09.12 周四

2.1)问题01:visual studio的相关快捷键有哪些?

Visual Studio 是一个功能强大的集成开发环境 (IDE),提供了许多快捷键来提高开发效率。以下是一些常用的快捷键:

通用快捷键

  • Ctrl + Shift + N: 新建项目
  • Ctrl + O: 打开文件
  • Ctrl + S: 保存文件
  • Ctrl + Shift + S: 全部保存
  • Ctrl + P: 打印
  • Ctrl + Z: 撤销
  • Ctrl + Y: 重做
  • Ctrl + X: 剪切
  • Ctrl + C: 复制
  • Ctrl + V: 粘贴
  • Ctrl + A: 全选
  • Ctrl + F: 查找
  • Ctrl + H: 替换
  • Ctrl + Shift + F: 全局查找
  • Ctrl + Shift + H: 全局替换

编辑

  • Ctrl + K, Ctrl + C: 注释选中代码
  • Ctrl + K, Ctrl + U: 取消注释选中代码
  • Ctrl + K, Ctrl + D: 格式化文档
  • Ctrl + K, Ctrl + F: 格式化选中代码
  • Ctrl + Space: 触发 IntelliSense
  • Ctrl + .: 快速修复(显示快速操作)

导航

  • Ctrl + T: 转到所有(文件、类型、成员等)
  • Ctrl + ,: 快速查找文件
  • F12: 转到定义
  • Alt + F12: 查看定义
  • Ctrl + -: 向后导航
  • Ctrl + Shift + -: 向前导航

调试

  • F5: 启动调试
  • Shift + F5: 停止调试
  • F9: 切换断点
  • F10: 逐过程
  • F11: 逐语句
  • Shift + F11: 退出当前函数

窗口管理

  • Ctrl + Alt + L: 打开解决方案资源管理器
  • Ctrl + Alt + O: 打开输出窗口
  • Ctrl + , Ctrl + M: 打开错误列表
  • Ctrl + Alt + X: 打开工具箱

这些快捷键可以帮助你更高效地使用 Visual Studio。你可以在 Visual Studio 中自定义快捷键,以适应你的工作习惯。

2.2)问题02: public partial class ChoosePLReason : CommonBaseForm

在C#中,partial关键字允许将一个类、结构或接口的定义分割成多个文件。每个文件都包含该类、结构或接口的一部分定义,最终在编译时所有部分会被组合成一个完整的定义。这在大型项目中非常有用,因为它允许多个开发人员同时编辑同一个类而不会产生冲突。

下面是一个关于partial类的简单示例:

文件1:ChoosePLReason_Part1.cs

public partial class ChoosePLReason : CommonBaseForm
{public void Method1(){Console.WriteLine("Method1 in Part1");}
}

文件2:ChoosePLReason_Part2.cs

public partial class ChoosePLReason : CommonBaseForm
{public void Method2(){Console.WriteLine("Method2 in Part2");}
}

在编译时,这两个文件会被组合成一个完整的ChoosePLReason类,包含Method1Method2方法。

你可以在任何一个部分中定义构造函数、属性、方法等,并且这些部分共享同一个类的成员。

需要注意的是:

  1. 所有部分必须使用partial关键字。
  2. 所有部分必须在同一个命名空间中。
  3. 所有部分组合起来必须形成一个有效的类定义。

2.3)问题03:介绍Windows Forms中的 System.Windows.Forms.DataGridViewRowCollection

System.Windows.Forms.DataGridViewRowCollection 是 Windows Forms 中 DataGridView 控件的一部分,用于表示 DataGridView 控件中的所有行的集合。DataGridView 是一个非常强大的控件,可以用来显示和管理数据表格。

以下是一些常用的 DataGridViewRowCollection 方法和属性:

常用属性:

  • Count: 获取集合中实际包含的元素数。
  • Item[Int32 index]: 获取或设置指定索引处的行。

常用方法:

  • Add(): 添加一行到 DataGridView
  • Add(Object[] values): 使用指定的值添加一行到 DataGridView
  • Clear(): 从集合中删除所有行。
  • Contains(DataGridViewRow dataGridViewRow): 确定指定的行是否在集合中。
  • Remove(DataGridViewRow dataGridViewRow): 从集合中移除指定的行。
  • RemoveAt(Int32 index): 移除指定索引处的行。

示例代码

以下是一个简单的示例,展示如何使用 DataGridViewRowCollectionDataGridView 中添加和移除行:

using System;
using System.Windows.Forms;public class DataGridViewExample : Form
{private DataGridView dataGridView;public DataGridViewExample(){dataGridView = new DataGridView{Dock = DockStyle.Fill,ColumnCount = 3};// 添加列标题dataGridView.Columns[0].Name = "ID";dataGridView.Columns[1].Name = "Name";dataGridView.Columns[2].Name = "Age";// 添加行string[] row1 = new string[] { "1", "John Doe", "30" };string[] row2 = new string[] { "2", "Jane Smith", "40" };dataGridView.Rows.Add(row1);dataGridView.Rows.Add(row2);// 移除第一行dataGridView.Rows.RemoveAt(0);Controls.Add(dataGridView);}[STAThread]static void Main(){Application.EnableVisualStyles();Application.Run(new DataGridViewExample());}
}

这个示例创建了一个包含三列的 DataGridView,然后添加了两行数据,并移除了第一行。DataGridView 控件被添加到窗体中并显示。

2.4) 问题04: 介绍下 C#中的 DataGridView 控件

DataGridView 是 C# 中用于显示和编辑表格数据的控件,通常用于 Windows 窗体应用程序中。它功能强大且灵活,能够处理大量数据,并提供多种自定义和扩展选项。以下是 DataGridView 控件的一些主要特性和使用方法:

主要特性

  1. 数据绑定DataGridView 可以绑定到多种数据源,如 DataTableBindingSourceList<T> 等。
  2. 列类型:支持多种列类型,包括文本框列(DataGridViewTextBoxColumn)、复选框列(DataGridViewCheckBoxColumn)、按钮列(DataGridViewButtonColumn)等。
  3. 排序和过滤:支持对数据进行排序和过滤,用户可以通过点击列头来排序数据。
  4. 自定义外观:可以自定义单元格、行、列和整个控件的外观,包括颜色、字体和边框样式等。
  5. 事件处理:提供了丰富的事件,如 CellClickCellValueChangedRowEnter 等,以便处理用户交互。
  6. 编辑和验证:支持单元格和行的编辑,并提供了数据验证功能。

基本用法

以下是一个简单的示例,展示了如何在 Windows 窗体应用程序中使用 DataGridView 控件:

using System;
using System.Data;
using System.Windows.Forms;public class DataGridViewExample : Form
{private DataGridView dataGridView;public DataGridViewExample(){InitializeComponent();}private void InitializeComponent(){this.dataGridView = new DataGridView();this.SuspendLayout();// 设置 DataGridView 属性this.dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;this.dataGridView.Location = new System.Drawing.Point(13, 13);this.dataGridView.Name = "dataGridView";this.dataGridView.Size = new System.Drawing.Size(600, 400);this.dataGridView.TabIndex = 0;// 添加 DataGridView 到窗体this.Controls.Add(this.dataGridView);// 窗体属性this.ClientSize = new System.Drawing.Size(800, 450);this.Name = "DataGridViewExample";this.Text = "DataGridView 示例";this.Load += new System.EventHandler(this.DataGridViewExample_Load);this.ResumeLayout(false);}private void DataGridViewExample_Load(object sender, EventArgs e){// 创建 DataTable 并添加数据DataTable table = new DataTable();table.Columns.Add("ID", typeof(int));table.Columns.Add("Name", typeof(string));table.Columns.Add("Age", typeof(int));table.Rows.Add(1, "Alice", 30);table.Rows.Add(2, "Bob", 25);table.Rows.Add(3, "Charlie", 35);// 将 DataTable 绑定到 DataGridViewthis.dataGridView.DataSource = table;}[STAThread]static void Main(){Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);Application.Run(new DataGridViewExample());}
}

注意事项

  1. 性能:对于大量数据,可以考虑使用虚拟模式(VirtualMode)来提高性能。
  2. 数据验证:在处理用户输入时,确保进行适当的数据验证,以防止无效数据的输入。
  3. 自定义:可以通过继承 DataGridView 或其列类型,来实现更复杂的自定义行为和外观。

DataGridView 是一个非常强大的控件,通过合理使用其各种特性,可以满足大多数表格数据展示和编辑的需求。

2.5)问题05:Windows 窗体应用程序 中有哪些常见的概念,类和控件等

在Windows窗体应用程序(Windows Forms Application)中,有许多常见的概念、类和控件。以下是一些关键的部分:

常见概念

  1. 事件驱动编程:Windows Forms 应用程序主要基于事件驱动的编程模型,用户的操作(如点击按钮、输入文本等)会触发事件,应用程序会对这些事件作出响应。

  2. 控件(Control):控件是构成用户界面的基本元素,如按钮、文本框等。

  3. 窗体(Form):窗体是应用程序的基本容器,可以包含各种控件。

常见类

  1. Form:表示一个窗体,是所有窗体类的基类。

  2. Application:提供方法来启动和停止应用程序、处理消息循环等。

  3. Control:所有控件的基类,提供了所有控件的基本属性和方法。

  4. Button:表示一个按钮控件。

  5. TextBox:表示一个文本框控件,允许用户输入文本。

  6. Label:表示一个标签控件,用于显示文本。

  7. DataGridView:表示一个数据网格控件,用于显示和编辑表格式数据。

  8. ComboBox:表示一个组合框控件,允许用户从下拉列表中选择一个选项。

  9. ListBox:表示一个列表框控件,允许用户选择一个或多个选项。

  10. CheckBox:表示一个复选框控件,允许用户选择或取消选择。

  11. RadioButton:表示一个单选按钮控件,通常与其他单选按钮一起使用,允许用户选择一个选项。

常见控件

  1. Button:按钮,用户点击以触发操作。

  2. Label:标签,用于显示文本或说明。

  3. TextBox:文本框,用户可以在其中输入文本。

  4. ComboBox:组合框,提供下拉列表供用户选择。

  5. ListBox:列表框,显示一组项供用户选择。

  6. CheckBox:复选框,用户可以选中或取消选中。

  7. RadioButton:单选按钮,用户可以选择一个选项。

  8. PictureBox:图片框,用于显示图像。

  9. ProgressBar:进度条,用于显示操作的进度。

  10. TabControl:选项卡控件,允许在多个选项卡之间切换。

事件

  1. Click:当用户点击控件时触发的事件。

  2. TextChanged:当控件的文本内容发生变化时触发的事件。

  3. Load:当窗体加载时触发的事件。

  4. FormClosing:当窗体即将关闭时触发的事件。

  5. MouseEnter:当鼠标指针进入控件时触发的事件。

  6. MouseLeave:当鼠标指针离开控件时触发的事件。

布局控件

  1. FlowLayoutPanel:流布局面板,控件按顺序排列。

  2. TableLayoutPanel:表格布局面板,控件按网格排列。

  3. Panel:面板,用于容纳其他控件。

这些只是Windows Forms中的一部分常见概念、类和控件。Windows Forms 提供了丰富的控件和类库,允许开发者构建功能强大且用户友好的桌面应用程序。

2.6) 问题06:WPF 中有哪些常见的概念,类和控件等

Windows Presentation Foundation (WPF) 是用于创建桌面应用程序的强大框架。以下是一些在 WPF 中常见的概念、类和控件:

常见概念

  1. XAML (Extensible Application Markup Language): 一种用于定义 WPF 界面的标记语言。
  2. 数据绑定: 将UI元素绑定到数据源的机制,支持双向绑定。
  3. 样式和模板: 定义和复用UI元素外观的方式。
  4. 资源: 定义和管理可重用的对象和样式。
  5. 依赖属性: 支持WPF高级功能的属性系统。
  6. 路由事件: 一种事件处理机制,可在元素树中冒泡或隧道传递事件。

常见类

  1. Application: 表示WPF应用程序的类。
  2. Window: 表示一个窗口。
  3. UserControl: 用于创建自定义控件的基类。
  4. FrameworkElement: 大多数WPF控件的基类。
  5. DependencyObject: 依赖属性系统的基类。
  6. Dispatcher: 管理线程间的工作调度。

常见控件

  1. Button: 表示一个按钮。
  2. TextBox: 表示一个文本输入框。
  3. Label: 表示一个标签,用于显示文本。
  4. ComboBox: 表示一个下拉列表。
  5. ListBox: 表示一个列表框。
  6. Grid: 一个用于定义行和列布局的容器。
  7. StackPanel: 一个用于在水平或垂直方向上排列子元素的容器。
  8. Canvas: 一个用于绝对定位子元素的容器。
  9. DockPanel: 一个用于将子元素停靠到容器边缘的容器。
  10. TabControl: 一个用于创建选项卡界面的控件。

数据绑定相关类

  1. Binding: 定义数据绑定的类。
  2. BindingExpression: 表示单个绑定的实例。
  3. IValueConverter: 用于在绑定时转换数据的接口。
  4. INotifyPropertyChanged: 通知属性值更改的接口。

资源和样式相关类

  1. ResourceDictionary: 用于存储资源的字典。
  2. Style: 定义控件外观的类。
  3. ControlTemplate: 定义控件结构和行为的模板。
  4. DataTemplate: 定义数据展示方式的模板。

通过这些概念、类和控件,你可以创建功能丰富且用户界面友好的WPF应用程序。

三、09.13 周五

3.1)问题01: git怎么查询本地有哪些 commit没有 push到远端?

你可以使用 git log 命令来查询本地有哪些 commit 没有 push 到远端。具体步骤如下:

  1. 打开终端并进入你的 Git 仓库目录。
  2. 运行以下命令:
git log origin/your-branch..your-branch

其中 your-branch 是你当前所在的分支的名称。例如,如果你当前在 main 分支上,命令将是:

git log origin/main..main

这个命令将显示自从你上次从远端拉取代码后,当前分支上新增的 commit。

另外,你也可以使用以下命令来查看本地和远端分支的差异:

git log HEAD..origin/your-branch

这个命令显示的是远端分支上有而本地分支上没有的 commit。

为了简化操作,你还可以使用 git status 命令来检查是否有未推送的 commit:

git status

如果有未推送的 commit,git status 会在输出中显示类似以下的信息:

Your branch is ahead of 'origin/your-branch' by X commits.

其中 X 是未推送的 commit 数量。

四、09.14 周六

4.1)问题01:C#代码中的 dll文件

在C#中,DLL(动态链接库)文件是一种包含可重用代码和资源的文件。DLL文件可以包含类、方法、属性等,可以在不同的C#项目中共享和使用。使用DLL文件的主要好处是代码重用、模块化和易于维护。

以下是如何在C#项目中创建和使用DLL文件的基本步骤:

创建DLL文件

  1. 创建类库项目
    打开Visual Studio并创建一个新的项目,选择“类库”(Class Library)项目类型。这将生成一个DLL文件。

  2. 编写代码
    在类库项目中编写你希望封装在DLL中的代码。例如:

    namespace MyLibrary
    {public class MyClass{public string GetMessage(){return "Hello from MyLibrary!";}}
    }
    
  3. 构建项目
    构建(Build)类库项目,Visual Studio将生成一个DLL文件,通常位于项目的bin\Debugbin\Release文件夹中。

使用DLL文件

  1. 引用DLL文件
    在你希望使用DLL文件的项目中,右键点击“引用”(References)节点,选择“添加引用”(Add Reference),然后选择“浏览”(Browse)并找到你生成的DLL文件。

  2. 使用命名空间
    在代码文件中使用using语句引入DLL文件中的命名空间,然后可以创建类的实例并调用其方法。例如:

    using MyLibrary;class Program
    {static void Main(){MyClass myClass = new MyClass();Console.WriteLine(myClass.GetMessage());}
    }
    

示例

以下是一个完整的示例,展示如何创建和使用DLL文件:

  1. 创建类库项目

    // MyLibrary.cs
    namespace MyLibrary
    {public class MyClass{public string GetMessage(){return "Hello from MyLibrary!";}}
    }
    
  2. 构建类库项目
    生成MyLibrary.dll文件。

  3. 在另一个项目中引用并使用DLL文件

    // Program.cs
    using System;
    using MyLibrary;class Program
    {static void Main(){MyClass myClass = new MyClass();Console.WriteLine(myClass.GetMessage());}
    }
    

通过以上步骤,你可以创建和使用C#中的DLL文件,从而实现代码的重用和模块化。

4.2) 问题02: C#中的注解(特性)

在C#中,注解(Annotation)通常被称为“特性”(Attributes)。特性是用于在代码中添加元数据的一种方法。你可以使用特性来标注类、方法、属性、字段等,使得这些元素在运行时或编译时能够被识别和处理。

以下是一个简单的示例,展示如何在C#中使用特性:

using System;// 自定义一个特性
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class MyCustomAttribute : Attribute
{public string Description { get; }public MyCustomAttribute(string description){Description = description;}
}// 使用自定义的特性
[MyCustomAttribute("This is a sample class")]
public class SampleClass
{[MyCustomAttribute("This is a sample method")]public void SampleMethod(){// 方法体}
}class Program
{static void Main(){// 获取类的特性var classAttributes = typeof(SampleClass).GetCustomAttributes(typeof(MyCustomAttribute), false);foreach (MyCustomAttribute attr in classAttributes){Console.WriteLine($"Class Attribute Description: {attr.Description}");}// 获取方法的特性var methodAttributes = typeof(SampleClass).GetMethod("SampleMethod").GetCustomAttributes(typeof(MyCustomAttribute), false);foreach (MyCustomAttribute attr in methodAttributes){Console.WriteLine($"Method Attribute Description: {attr.Description}");}}
}

在这个示例中,我们定义了一个自定义特性 MyCustomAttribute,并将其应用到一个类和一个方法上。然后,在 Main 方法中,我们通过反射获取并打印这些特性的信息。

C# 中有许多内置的特性,如 [Obsolete][Serializable][DllImport] 等,你也可以根据需要定义自己的特性。

4.3) 问题03:AssemblyInfo.cs文件 [assembly: AssemblyTitle(“MyCode.Entity”)]

这段代码是C#语言中的一个属性(Attribute),用于为程序集(Assembly)提供元数据。具体来说,它设置了程序集的标题信息。

详细解释如下:

  • assembly::这是一个特性(Attribute)目标指示符,表明接下来的特性是应用于整个程序集的。
  • AssemblyTitle:这是一个特性类,用于指定程序集的标题。标题通常是一个简短的描述,用于标识程序集的用途或内容。
  • "JD.WMS3.Checkstock.Entity":这是传递给 AssemblyTitle 特性的参数,也就是程序集的标题。在这个例子中,标题是 JD.WMS3.Checkstock.Entity,这可能表示这个程序集与京东(JD)的WMS(仓库管理系统)的盘点(Checkstock)相关的实体(Entity)有关。

该特性通常放置在 AssemblyInfo.cs 文件中,用于描述程序集的一些基本信息。这样的信息在生成的程序集文件(如DLL或EXE)中是可见的,并且可以在查看程序集的属性时看到。

例如,AssemblyInfo.cs 文件中的其他类似特性可能包括:

  • AssemblyDescription:程序集的描述。
  • AssemblyConfiguration:程序集的配置(如Debug或Release)。
  • AssemblyCompany:程序集的公司名称。
  • AssemblyProduct:程序集的产品名称。

这些元数据有助于管理和识别程序集,特别是在大型项目和团队协作开发中。

4.4)问题04:C#中 using 块语句

在C#中,using块语句用于确保实现了IDisposable接口的对象在使用完之后能够被正确地释放和清理。这通常用于管理非托管资源,如文件句柄、数据库连接等。

典型的using块语句的语法如下:

using (var resource = new SomeDisposableResource())
{// 使用resource
}

using块结束时(大括号闭合处),resource对象的Dispose方法会被自动调用,无需显式调用Dispose方法。这有助于避免资源泄漏,并使代码更简洁和易读。

以下是一个具体的示例,演示了如何使用using块来管理文件资源:

using System;
using System.IO;class Program
{static void Main(){string path = "example.txt";// 使用 using 块处理文件资源using (StreamWriter writer = new StreamWriter(path)){writer.WriteLine("Hello, World!");}// 文件写入操作完成,StreamWriter 的 Dispose 方法已经被调用Console.WriteLine("文件已写入并关闭。");}
}

在这个例子中,StreamWriter实现了IDisposable接口,因此可以使用using块来确保文件在写入操作完成后被正确关闭。

需要注意的是,using块可以嵌套使用,以处理多个可处置对象:

using (var resource1 = new SomeDisposableResource())
{using (var resource2 = new AnotherDisposableResource()){// 使用 resource1 和 resource2}
}

在这种情况下,resource2会在using块结束时首先被释放,然后是resource1。这种嵌套使用方式确保了每个资源都能被正确地释放。

4.5)问题05:WinForm中的 Form类的使用

在WinForms应用程序中,Form类是所有窗口的基类。它提供了创建、显示和管理窗口的基本功能。以下是一些关于Form类的关键点和如何使用它的示例:

1. 创建一个基本的Form

首先,你需要创建一个新的Windows Forms应用程序。然后,你可以继承Form类来创建自定义窗口。

using System;
using System.Windows.Forms;public class MyForm : Form
{public MyForm(){// 设置窗口的标题this.Text = "My First WinForm";// 设置窗口的大小this.Size = new System.Drawing.Size(800, 600);// 可以在这里添加控件和其他初始化代码}[STAThread]static void Main(){Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);// 创建并运行主窗口Application.Run(new MyForm());}
}

2. 添加控件

你可以在Form中添加各种控件,如按钮、标签、文本框等。

public class MyForm : Form
{private Button myButton;public MyForm(){this.Text = "My First WinForm with Button";this.Size = new System.Drawing.Size(800, 600);// 初始化按钮myButton = new Button();myButton.Text = "Click Me!";myButton.Location = new System.Drawing.Point(350, 250);// 添加按钮的点击事件处理程序myButton.Click += new EventHandler(MyButton_Click);// 将按钮添加到Form中this.Controls.Add(myButton);}private void MyButton_Click(object sender, EventArgs e){MessageBox.Show("Button Clicked!");}
}

3. 处理事件

WinForms使用事件驱动编程模型。你可以通过订阅事件来处理用户交互。

private void MyButton_Click(object sender, EventArgs e)
{MessageBox.Show("Button Clicked!");
}

4. 显示和关闭窗口

你可以使用ShowClose方法来显示和关闭窗口。

public class MyForm : Form
{private Button closeButton;public MyForm(){this.Text = "Form with Close Button";this.Size = new System.Drawing.Size(800, 600);closeButton = new Button();closeButton.Text = "Close";closeButton.Location = new System.Drawing.Point(350, 250);closeButton.Click += new EventHandler(CloseButton_Click);this.Controls.Add(closeButton);}private void CloseButton_Click(object sender, EventArgs e){this.Close();}
}

5. 设置窗口属性

你可以设置Form的各种属性,如StartPositionFormBorderStyleBackColor等。

public MyForm()
{this.Text = "Custom Form";this.Size = new System.Drawing.Size(800, 600);this.StartPosition = FormStartPosition.CenterScreen; // 居中显示this.FormBorderStyle = FormBorderStyle.FixedDialog;  // 固定边框this.BackColor = System.Drawing.Color.LightBlue;     // 背景颜色
}

总结

Form类是WinForms应用程序的核心,它提供了创建和管理窗口的基本功能。通过继承Form类,你可以创建自定义窗口,添加控件,处理事件以及设置各种属性。这个过程使得开发桌面应用程序变得相对简单和直观。

相关文章:

技术周总结 09.09~09.15周日(C# WinForm WPF)

文章目录 一、09.09 周一1.1) 问题01: Windows桌面开发中&#xff0c;WPF和WinForm的区别和联系&#xff1f;联系&#xff1a;区别&#xff1a; 二、09.12 周四2.1&#xff09;问题01&#xff1a;visual studio的相关快捷键有哪些&#xff1f;通用快捷键编辑导航调试窗口管理 2…...

4K投影仪选购全攻略:全玻璃镜头的当贝F6,画面细节纤毫毕现

在当今的投影市场上&#xff0c;4K投影仪已经成了主流产品&#xff0c;越来越多家庭开始关注如何选择一款性价比高、口碑好的4K投影仪。4K投影仪其实指的是具备3840*2160像素分辨率投影仪&#xff0c;它能够提供更清晰、更细腻、更真实的画面效果。 那么4K投影仪该怎么选&…...

除了字符串前导的*号之外,将串中其它*号全部删除

要求 假定输入的字符串中只包含字母和*号。请编写函数fun&#xff0c;它的功能是:除了字符串前导的*号之外&#xff0c;将串中其它*号全部删除。在编写函数时&#xff0c;不得使用C语言提供的字符串函数。函数fun中给出的语句仅供参考。 例如&#xff0c;字符串中的内容为:-**…...

SpringBoot开发——使用@Slf4j注解实现日志输出

文章目录 1、Lombok简介2、SLF4J简介3、实现步骤3.1 创建SpringBoot项目3.2 添加依赖3.3 使用 Slf4j 注解3.4 输出日志信息 4、结论 在现代Java开发中&#xff0c;日志记录是至关重要的。它不仅帮助开发者调试代码&#xff0c;还便于监控系统运行状态和性能。 Lombok 和 SLF4J …...

VSCode拉取远程项目

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…...

【已解决】SpringBoot3项目整合Druid依赖:Druid监控页面404报错

文章标题 问题描述原因分析解决方案参考资料 问题描述 最近&#xff0c;笔者在SpringBoot3项目中整合Druid连接池时&#xff0c;偶然翻到一条介绍Druid监控的短视频&#xff0c;兴致盎然之下尝试设置了一下Druid监控。 But&#xff0c;按照视频中提供的yml参数对照设置&#x…...

【算法】滑动窗口—找所有字母异位词

“找到字符串中所有字母异位词”的难度为Medium&#xff0c;看一下题目&#xff1a; 给定一个字符串 S 和一个非空字符串 T&#xff0c;找到 S 中所有是 T 的字母异位词的子串&#xff0c;返回这些子串的起始索引。 所谓的字母异位词&#xff0c;其实就是全排列&#xff0c;原题…...

Vue安装及环境配置【图解版】

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 Facts speak louder than words&#xff01; 目录 一.node.js的安装…...

绕过CDN查找真实IP方法

1、前言 在新型涉网案件中&#xff0c;我们在搜集到目标主站之后常常需要获取对方网站的真实IP去进一步的信息搜集&#xff0c;但是现在网站大多都部署了CDN&#xff0c;将资源部署分发到边缘服务器 实现均衡负载&#xff0c;降低网络堵塞&#xff0c;让用户能够更快地访问自己…...

Qt与MQTT交互通信

MQTT全称是&#xff08;Message Queuing Telemetry Transport&#xff09;&#xff0c;即消息队列遥测传输协议 是一种基于发布/订阅&#xff08;Publish/Subscribe&#xff09;模式的轻量级通讯协议&#xff0c;并且该协议构建于TCP/IP协议之上&#xff0c;常用于互联网中&am…...

dd 命令:复制和转换文件

一、dd 命令简介 ​dd​ 命令是一个在 Unix 和类 Unix 系统中用于复制文件和转换文件的命令行工具。它的功能非常强大&#xff0c;可以用于各种目的&#xff0c;例如创建镜像文件、备份和恢复数据、复制数据等。 ​dd​ 是一个用于读取、转换和写入数据的工具&#xff0c;通常…...

文件系统(磁盘 磁盘文件 inode)

文章目录 磁盘看看物理磁盘磁盘的存储结构 对磁盘的储存进行逻辑抽象inode号文件名 -> inode判断文件在哪个分区 磁盘 电脑中存在非常多的文件&#xff0c;被打开的文件只是少量的。 没有被打开的文件&#xff0c;在磁盘中放着&#xff0c;那么文件是如何存取&#xff1f; …...

ThreeJs创建圆环

ThreeJs除了创建基本的长方体&#xff0c;球形&#xff0c;圆柱等几何体&#xff0c;也可以创建一些特殊的几何体&#xff0c;比如圆环&#xff0c;多边体&#xff0c;这节就来讲怎么用Threejs绘制出圆环。首先依然是要创建出基础的组件&#xff0c;包括场景&#xff0c;相机&a…...

React实现类似Vue的路由监听Hook

React实现类似Vue的路由监听Hook 监听路由变化&#xff1b;React Hook封装&#xff0c;返回回调函数&#xff0c;新旧路由为函数参数&#xff1b; 代码 import { useEffect, useRef } from react; import { useHistory, useLocation } from react-router-dom;/*** 监听路由变…...

Visual Studio打开项目的一些小技巧

Visual Studio(VS)是一款功能强大的集成开发环境&#xff0c;许多刚入门C/C的小白也会使用这款软件进行写代码&#xff0c;然而它的操作并不简单&#xff0c;下面将讲解一下VS打开项目文件的一些小技巧。 目录 &#x1f381;创建空项目 ❤️①点击“创建新项目” ❤️②点击“…...

前端页面中使用 ppt 功能,并且可以随意插入关键帧

要在前端页面中实现类似 PowerPoint 的功能&#xff0c;并且能够随意插入和控制关键帧动画&#xff0c;你可以使用 HTML、CSS 和 JavaScript 结合的方式来创建一个互动幻灯片系统。以下是一个详细的实现方案&#xff0c;包括如何插入和控制关键帧动画&#xff1a; 1. 基础 HTM…...

机器学习:opencv--图像金字塔

目录 一、图像金字塔 1.图像金字塔是什么&#xff1f; 2.有哪些常见类型&#xff1f; 3.金字塔的构建过程 4.图像金字塔的作用 二、图像金字塔中的操作 1.向下采样 2.向上采样 3.注意--无法复原 三、代码实现 1.高斯金字塔向下采样 2.高斯金字塔向上采样 3.无法复…...

linux安全软件Hydra使用教程

Hydra 是一个强大的网络登录工具&#xff0c;常用于渗透测试&#xff0c;支持对多种服务和协议&#xff08;如 SSH、FTP、HTTP 等&#xff09;进行暴力crack攻击。它可以通过字典攻击来测试用户名和密码的有效性。以下是关于如何使用 Hydra 的基本步骤和示例&#xff1a; 1. 安…...

【ShuQiHere】从晶体管到逻辑门:数字电路的构建之旅

【ShuQiHere】 现代计算机和电子设备的基础是逻辑电路&#xff08;Logic Circuits&#xff09;&#xff0c;它们执行信息处理和运算任务。在这些电路的核心&#xff0c;是晶体管&#xff08;Transistors&#xff09; 和 逻辑门&#xff08;Logic Gates&#xff09;。通过理解这…...

PDF扫描版文字识别OCR

PDF扫描版文字识别OCR 最近需要有对PDF扫描版进行文字可识别的需求&#xff0c;这里介绍一款工具挺好用的 这是一款开源的OCR工具 github地址 https://github.com/hiroi-sora/Umi-OCR 主要功能及特点 免费&#xff1a;本项目所有代码开源&#xff0c;完全免费。方便&#…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录&#xff0c;不允许匿名访问&#xff0c;kefu只能访问/data/kefu目录&#xff0c;不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

C++ 设计模式 《小明的奶茶加料风波》

&#x1f468;‍&#x1f393; 模式名称&#xff1a;装饰器模式&#xff08;Decorator Pattern&#xff09; &#x1f466; 小明最近上线了校园奶茶配送功能&#xff0c;业务火爆&#xff0c;大家都在加料&#xff1a; 有的同学要加波霸 &#x1f7e4;&#xff0c;有的要加椰果…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 &#xff08;一&#xff09;项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台&#xff0c;其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言&#xff0c;首次接触 OpenBCI 设备时&#xff0c;往…...

算法打卡第18天

从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder [9,3,15,20,7…...