C# WindowForm界面初探,窗体访问,绑定数据源,重载构造函数
今日份主要内容
C# WindowForm界面初探
- Winform项目模板,目录解析
- 窗体对象
- 控件对象
- 界面设计基础
1.控件
控件的本质是类,控件是构建用户界面(User Interface)的基础,通过控件组合设计出符合需求的界面效果。
相当于html的标签。
基本要求:
- 界面效果,布局
- 交互(事件,委托)
2.学习控件的技巧
公共的属性:修改界面效果
事件:修改行为
Winform控件官方文档:按功能列出控件 - Windows Forms .NET Framework | Microsoft Learn
Winform官方简单的案例:使用 C# 创建 Windows 窗体应用 - Visual Studio (Windows) | Microsoft Learn
第一个控件,窗体Form:提供一个界面容器,Form继承于基类System.Windows.Forms.Form。
public partial class Form1 : Form{
}
fn+f7打开窗体的业务逻辑代码进行查看或编写,fn+f4打开控件的属性进行简单的调整。可以双击控件,就能查看代码。
反编译查看Form,using Drawing; //系统设计好的,也可以自定义绘制GDI+。
三个重要的位置:FormXXX.cs,设计器(搭建界面),控件的属性窗口。
- 想操作一个控件,前提是先选中一个控件。
- 两个窗体之间传递数据:通过构造函数。
- 窗体事件:FormLoad,FormClosed,Click
- 数据绑定:把数据源绑定到一个控件 binding 上,数据源和控件之间建立联系。
- alt+enter +enter引入命名空间
代码演示
Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace _1.窗体
{
internal static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
// 窗体启用样式
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
// 应用程序启动一个主窗体(第一个窗体)
Application.Run(new Form1());
}
}
}
Form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace _1.窗体
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
Console.WriteLine("hello world1111");
Debug.WriteLine("hello world22222");
}
private void btnStudentList_Click(object sender, EventArgs e)
{
// 编写一段代码,打开新窗体
// 1.实例化一个窗体对象, this当前窗体的实例,通过另外一个窗体的构造函数,把当前窗体的实例传递过去。
StudentForm studentForm = new StudentForm(this,"学生列表");
studentForm.Show(); // 打开一个窗体
//this.Close();// 关闭当前窗体
this.Hide(); // 隐藏窗体
//studentForm.ShowDialog(); // 以对话框的形式打开窗体。
}
}
}
StudentForm.cs
using _1.窗体.Data;
using _1.窗体.Model;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace _1.窗体
{
public partial class StudentForm : Form
{
private Form mainForm = null;
// 窗体的构造函数,默认是无参的构造函数,改成有参构造函数,方便接收传递的数据。
// 参数form1类型是窗体Form,用来存储传递过来的this。初始化当前窗体时,可以把form1窗体的实例传递过来。
public StudentForm(Form form1, string text)
{
InitializeComponent();
mainForm = form1;
this.Text = text;
Debug.WriteLine("构造函数执行");
}
private void StudentForm_Load(object sender, EventArgs e)
{
Debug.WriteLine("窗体的Load事件构造函数执行");
// 倒推
BindDataGridView();
}
// 2. 把数据源students和datagridview控件绑定一起。
private void BindDataGridView()
{
// 先把上次绑定的数据源清除,
dataGridView1.DataSource = null;
// 再重新绑定,这样可以解决列表中数据已变化,但网格没有刷新的问题。
dataGridView1.DataSource = StudentData.Students;//StudentData作为数据源,是一个类,Students是这个类里面的列表。而列表里数据的类型则是由另一个Student类定义的,Student是一个实体类。实体类:实体本质对现实的描述,映射ORM(Object Relation Mapping) POCO,这里不做展示。
}
// FormClosed
private void StudentForm_FormClosed(object sender, FormClosedEventArgs e)
{
mainForm.Show();//这个需要自行绑定事件,才会有效果。
}
private void btnAdd_Click(object sender, EventArgs e)
{
AddStudentForm form = new AddStudentForm();
// 窗体对话框会返回一个结果,是个枚举值,常用的结果:OK,Cancel
// AddStudentForm窗体返回的结果。
DialogResult dialogResult = form.ShowDialog();
if (dialogResult == DialogResult.OK)
{
// 重新绑定数据源
BindDataGridView();
}
}
}
}
小tip
关于C#里的sln文件和csporj文件的区别:初学C#,总结一下.sln和.csproj的区别 - ProZkb - 博客园 (cnblogs.com)