本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:本资源旨在引导初学者了解和学习C#编程语言,包括构建Windows桌面、Web应用和游戏开发等。资源集合了从基础到进阶的实例,强调实践学习,涵盖了Windows Forms开发的各个方面,如控件使用、事件处理、数据绑定、对话框应用、窗体设计、异常处理和多线程等。此外,还包含详细文档解释和编程最佳实践,帮助初学者快速掌握C#编程基础和建立项目开发的初步认识。

1. C#编程入门介绍

1.1 C#语言概述

C#是一种简单、现代、面向对象的编程语言,由微软开发,用于.NET平台。它继承了C和C++的语法,并增加了类型安全、版本控制和简化组件软件开发的功能。C#在设计上受到了Java语言的影响,但是它的特性更为丰富,更加强调版本兼容性和语言互操作性。

1.2 C#开发环境搭建

要开始C#编程,首先需要配置好开发环境。推荐使用Visual Studio IDE,它提供了集成开发环境,支持C#语言开发以及各种项目类型,包括Windows Forms应用、ASP.NET网站等。安装Visual Studio时,确保选择“.NET桌面开发”工作负载。

1.3 编写第一个C#程序

开发C#程序的第一步是创建一个新的控制台应用程序项目。在Visual Studio中选择“创建新项目”,然后选择“控制台应用(.NET Core)”(或.NET Framework,取决于你选择的版本)。在创建项目后,你可以看到一个默认的“Hello World!”程序。你可以通过修改 Main 方法中的代码来创建自己的C#程序。

using System;

namespace HelloWorld
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello, World!");
        }
    }
}

以上代码块展示了最基础的C#程序结构。通过上述步骤,你可以快速搭建起C#编程的入门环境,并编写出自己的第一个程序。

2. Windows Forms应用开发

2.1 Windows Forms基础

2.1.1 Windows Forms概述

Windows Forms 是一种用于创建基于 Windows 的应用程序的用户界面(UI)框架。它是 .NET Framework 的一部分,并提供了一组丰富的 UI 控件,允许开发者构建功能丰富的桌面应用程序。开发者可以使用 C# 或其他支持的语言,通过拖放控件和编写代码的方式快速搭建应用程序的用户界面。Windows Forms 应用程序能够提供一致的用户体验,并且可以访问 Windows 操作系统的底层功能。

Windows Forms 应用的主要组成部分包括窗体(Forms),控件(Controls),事件处理,以及相关的属性和方法。窗体是应用程序的窗口,控件是窗体上的各种元素(如按钮、文本框等),而事件处理则是响应用户交互的方式。

2.1.2 创建第一个Windows Forms应用程序

要创建一个简单的 Windows Forms 应用程序,我们首先需要使用 Visual Studio 这类集成开发环境(IDE),它是微软提供的一个流行的开发工具。

下面是一个创建新 Windows Forms 应用程序的基本步骤:

  1. 打开 Visual Studio。
  2. 选择“创建新项目”。
  3. 在项目类型中选择“Windows Forms App (.NET Framework)”。
  4. 命名你的项目并选择保存位置。
  5. 点击“创建”按钮开始项目。

一旦项目创建成功,你会看到一个默认的窗体。在这个窗体上,你可以通过工具箱添加控件,比如按钮、文本框等,并通过双击控件或设置事件处理程序来编写响应用户操作的代码。

让我们以创建一个带有按钮和文本框的窗体为例:

using System;
using System.Windows.Forms;

namespace SimpleWindowsFormsApp
{
    public partial class MainForm : Form
    {
        private Button btnClickMe;
        private TextBox txtDisplay;

        public MainForm()
        {
            InitializeComponent();
            InitializeForm();
        }

        private void InitializeForm()
        {
            this.btnClickMe = new Button();
            this.btnClickMe.Text = "Click Me";
            this.btnClickMe.Location = new System.Drawing.Point(10, 10);
            this.btnClickMe.Size = new System.Drawing.Size(100, 50);
            this.btnClickMe.Click += new EventHandler(this.btnClickMe_Click);

            this.txtDisplay = new TextBox();
            this.txtDisplay.Location = new System.Drawing.Point(10, 70);
            this.txtDisplay.Size = new System.Drawing.Size(260, 20);

            this.Controls.Add(this.btnClickMe);
            this.Controls.Add(this.txtDisplay);
        }

        private void btnClickMe_Click(object sender, EventArgs e)
        {
            this.txtDisplay.Text = "Button Clicked!";
        }
    }
}

上面的代码展示了如何初始化窗体和控件,以及如何添加一个点击事件处理器。运行程序后,当用户点击按钮,文本框中会显示“Button Clicked!”文本。

2.2 窗体与控件的关系

2.2.1 理解窗体和控件的层次结构

在 Windows Forms 应用程序中,窗体是容器,可以容纳各种控件。控件可以被添加到窗体上,并且可以设置其属性以定义外观和行为。这种层次结构使得窗体可以管理其包含的控件。

控件在层次结构中位于窗体之下,可以分为两种类型:独立控件和容器控件。独立控件直接与窗体关联,如按钮和文本框;而容器控件可以包含其他控件,如 Panel 和 GroupBox。

2.2.2 控件的添加和初始配置

要将控件添加到窗体中,首先需要从工具箱中拖动控件到窗体设计界面上。Visual Studio IDE 提供的工具箱包含了各种控件,比如按钮(Button)、文本框(TextBox)、标签(Label)等。

为控件设置初始属性是开发过程中一个重要的步骤,可以影响控件的外观和功能。以下是一些常见属性的设置示例:

private void InitializeForm()
{
    // 创建一个文本框控件
    TextBox txtName = new TextBox();
    txtName.Location = new Point(10, 50); // 设置文本框的位置
    txtName.Size = new Size(200, 20); // 设置文本框的大小
    txtName.Text = "Enter Name"; // 设置文本框中的初始文本
    this.Controls.Add(txtName); // 将文本框添加到窗体的控件集合中
}

通过设置控件的属性,开发者可以控制控件的尺寸、位置、颜色、字体等。这些设置不仅影响应用程序的用户界面,也影响控件的功能性,如文本框可以获取用户输入的数据。

2.3 应用生命周期管理

2.3.1 应用启动与关闭流程

在 Windows Forms 应用程序中,当用户启动应用程序时,会触发窗体的加载和显示过程,从而开始应用程序的生命周期。当应用程序关闭时,相应的窗体会卸载,应用程序生命周期结束。

应用程序启动时,通常会先加载 Main 方法中的代码,然后创建窗体实例。Main 方法一般如下:

static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new MainForm()); // MainForm 是主窗体类
}

上述代码中, Application.Run(new MainForm()) 表示运行主窗体,它是应用程序的入口点。

2.3.2 窗体的加载与卸载事件处理

窗体的加载(Load)和卸载(Unload)事件允许开发者在窗体生命周期的不同阶段执行代码。例如,加载时初始化控件,卸载时清理资源。

加载事件发生时,窗体及其控件已经被实例化,但还未能显示给用户。开发者可以利用此事件来设置初始属性或者加载必要的资源。

public MainForm()
{
    InitializeComponent();
    this.Load += new System.EventHandler(this.MainForm_Load);
}

private void MainForm_Load(object sender, EventArgs e)
{
    // 在此处执行加载后的代码,例如初始化数据等
}

卸载事件则在窗体即将关闭前触发,这个时机通常用于释放资源或保存应用程序的状态:

private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
    // 在窗体关闭前保存设置或进行清理工作
}

正确管理应用程序的生命周期对于构建稳定和响应用户操作的应用程序至关重要。开发者需要熟练掌握这些事件的处理方式,并在适当的时候应用它们。

3. 控件使用与布局

在上一章节中,我们初步了解了Windows Forms的基本架构和生命周期管理。本章将深入探讨Windows Forms中的控件使用和布局策略,这是构建复杂用户界面的关键部分。Windows Forms提供了一系列丰富的控件来帮助开发者创建功能丰富的应用程序。布局管理则是确保这些控件在不同分辨率和屏幕尺寸上能够得体展现的基础。

3.1 常用控件介绍

3.1.1 文本框、按钮和标签控件的使用

文本框(TextBox)、按钮(Button)和标签(Label)是Windows Forms中最为常见的三种控件。它们是实现用户输入、命令执行和信息展示的基础。下面将介绍它们的使用方法以及如何在应用程序中进行操作。

// 示例代码:创建文本框、按钮和标签控件

// 创建一个标签控件
Label myLabel = new Label();
myLabel.Text = "请输入文本:";
this.Controls.Add(myLabel);

// 创建一个文本框控件
TextBox myTextBox = new TextBox();
myTextBox.Location = new System.Drawing.Point(10, 30); // 设置文本框在窗体中的位置
this.Controls.Add(myTextBox);

// 创建一个按钮控件
Button myButton = new Button();
myButton.Text = "提交";
myButton.Location = new System.Drawing.Point(10, 60); // 设置按钮在窗体中的位置
myButton.Click += new EventHandler(MyButton_Click); // 为按钮添加点击事件处理程序
this.Controls.Add(myButton);

// 点击事件处理程序的实现
private void MyButton_Click(object sender, EventArgs e)
{
    string userInput = myTextBox.Text;
    MessageBox.Show("您输入的内容是:" + userInput); // 显示用户输入的内容
}

在上述代码中,我们创建了三个控件:Label、TextBox和Button,并将它们添加到窗体的控件集合中。我们为Button控件设置了点击事件处理程序 MyButton_Click ,当用户点击按钮时,程序会从TextBox中获取文本,并通过一个消息框弹出显示。

3.1.2 列表框、组合框和数据绑定控件

列表框(ListBox)、组合框(ComboBox)等控件允许用户在多个选项中进行选择。数据绑定控件如DataGridView和ListView则可以展示数据集合,非常适用于显示和管理大量数据。

// 示例代码:创建列表框、组合框控件

// 创建一个列表框控件
ListBox myListBox = new ListBox();
myListBox.Items.Add("选项1");
myListBox.Items.Add("选项2");
myListBox.Items.Add("选项3");
myListBox.Location = new System.Drawing.Point(10, 100);
this.Controls.Add(myListBox);

// 创建一个组合框控件
ComboBox myComboBox = new ComboBox();
myComboBox.Items.Add("选项A");
myComboBox.Items.Add("选项B");
myComboBox.Items.Add("选项C");
myComboBox.Location = new System.Drawing.Point(10, 130);
this.Controls.Add(myComboBox);

上述代码创建了ListBox和ComboBox控件,并向它们的集合中添加了几个选项。这些控件不仅能够显示静态的数据项,还可以通过数据绑定机制与数据源连接,动态地展示数据。

3.2 布局管理

3.2.1 容器控件与布局策略

容器控件如Panel、Groupbox,它们的作用是作为其他控件的容器,可以在它们内部包含多个子控件。使用容器控件可以使界面布局更加规整,还可以将控件进行逻辑分组。

// 示例代码:使用Panel容器控件管理布局

// 创建一个Panel容器控件
Panel myPanel = new Panel();
myPanel.Text = "控件容器";
myPanel.Location = new System.Drawing.Point(10, 170);
myPanel.Size = new System.Drawing.Size(260, 100);
this.Controls.Add(myPanel);

// 将之前创建的标签、文本框和按钮添加到Panel中
myLabel.Parent = myPanel;
myTextBox.Parent = myPanel;
myButton.Parent = myPanel;

在上述代码中,我们创建了一个Panel控件,并为其设置了文本、位置和大小。我们还把之前创建的标签、文本框和按钮控件移动到了Panel控件中。通过将控件组织在Panel中,可以轻松地移动和管理这些控件。

3.2.2 使用布局控件实现响应式设计

响应式设计意味着界面能够适应不同的屏幕尺寸和分辨率。为了实现这一点,开发者通常会使用如FlowLayoutPanel和TableLayoutPanel等布局控件,这些控件可以帮助控件自动地根据窗体大小调整布局。

// 示例代码:使用FlowLayoutPanel实现控件的响应式布局

// 创建FlowLayoutPanel容器控件
FlowLayoutPanel myFlowLayoutPanel = new FlowLayoutPanel();
myFlowLayoutPanel.WrapContents = false;
myFlowLayoutPanel.ActionBar = false;
myFlowLayoutPanel.Location = new System.Drawing.Point(10, 280);
myFlowLayoutPanel.Size = new System.Drawing.Size(260, 200);
this.Controls.Add(myFlowLayoutPanel);

// 添加标签、文本框和按钮控件到FlowLayoutPanel中
myFlowLayoutPanel.Controls.Add(myLabel);
myFlowLayoutPanel.Controls.Add(myTextBox);
myFlowLayoutPanel.Controls.Add(myButton);

在此示例中,我们创建了一个FlowLayoutPanel控件,并设置了其位置和大小。我们还向FlowLayoutPanel中添加了标签、文本框和按钮控件。FlowLayoutPanel会自动地组织这些控件,使其在水平方向上按顺序排列,如果超出了容器的宽度,它会自动换行。

3.3 高级布局技术

3.3.1 自定义控件布局

在某些情况下,内置的布局控件可能无法满足特定的布局需求,这时就需要使用自定义控件布局。这涉及到设置控件的 Location Size 属性,或者使用控件的 Anchor Dock 属性来实现更复杂的布局。

// 示例代码:使用Anchor属性实现控件自适应布局

// 创建一个TextBox控件,并设置Anchor属性
TextBox myAdaptiveTextBox = new TextBox();
myAdaptiveTextBox.Location = new System.Drawing.Point(25, 25);
myAdaptiveTextBox.Size = new System.Drawing.Size(200, 20);
myAdaptiveTextBox.Anchor = (AnchorStyles.Left | AnchorStyles.Top);
this.Controls.Add(myAdaptiveTextBox);

// 创建一个Button控件,并设置Anchor属性
Button myAdaptiveButton = new Button();
myAdaptiveButton.Location = new System.Drawing.Point(125, 50);
myAdaptiveButton.Size = new System.Drawing.Size(100, 40);
myAdaptiveButton.Anchor = (AnchorStyles.Right | AnchorStyles.Top);
this.Controls.Add(myAdaptiveButton);

在本示例中,我们创建了两个控件,并为它们设置了 Anchor 属性。当窗体大小发生变化时, myAdaptiveTextBox 会保持在窗体的左上角,并根据窗体的宽度变化而改变其宽度; myAdaptiveButton 则会保持在窗体的右上角。这种方式可以实现控件的自适应布局。

3.3.2 多窗体应用程序的布局管理

在多窗体应用程序中,合理地管理各个窗体的布局也非常重要。这涉及到如何根据应用程序的需求来显示和隐藏窗体,以及如何组织窗体之间的层次关系。

// 示例代码:多窗体布局管理

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void ShowAnotherForm()
    {
        Form2 myForm2 = new Form2();
        myForm2.TopLevel = false; // 设置Form2为Form1的子窗体
        myForm2.Dock = DockStyle.Fill; // Dock属性使Form2填充Form1的空间
        this.Controls.Add(myForm2); // 将Form2添加到Form1的控件集合中
        myForm2.Show();
    }
}

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
    }
}

在上述代码中,我们在 Form1 中创建了一个 Form2 实例,并将其设置为 TopLevel 属性为 false ,然后将其 Dock 属性设置为 DockStyle.Fill ,这意味着 Form2 会自动填充 Form1 的空间。通过 this.Controls.Add(myForm2) ,将 Form2 添加到 Form1 的控件集合中,从而实现了 Form2 Form1 中显示。

通过本章节的介绍,我们学习了如何在Windows Forms中使用和管理控件,包括如何使用容器控件和布局策略来创建灵活、可扩展的用户界面。此外,还了解了自定义控件布局和管理多窗体应用程序布局的高级技术。掌握了这些知识,我们就可以构建出功能更加丰富、用户体验更加出色的Windows Forms应用程序。

4. 事件处理机制

事件处理是编程中非常重要的一个概念,尤其是对于图形用户界面(GUI)编程来说。C#中事件处理机制是基于委托和事件的。在这一章节中,我们将深入探索C#的事件处理机制,包括事件与委托的关系,如何在事件驱动的编程实践中处理标准控件事件,以及一些高级事件处理技巧。

4.1 事件与委托

4.1.1 事件的基本概念和声明

事件是.NET框架中用于实现“发布-订阅”模式的一种机制。事件允许一个对象(发布者)向其他对象(订阅者)通知发生了一个特定的事务。C#中的事件是通过委托实现的,委托是一个指向方法的引用,可以将方法作为参数传递给其他方法。事件实际上是特殊的多播委托,它可以有零个或多个订阅者。

在C#中,声明事件使用关键字 event ,后面跟着委托类型的定义。例如,一个简单的计时器事件可以这样声明:

public event EventHandler<TimerElapsedEventArgs> TimerElapsed;

这里, EventHandler<T> 是.NET框架提供的一个通用委托类型,用于处理包含两个参数(sender对象和事件数据)的事件。 TimerElapsedEventArgs 是自定义的类,用于包含事件数据。

4.1.2 委托的作用和类型

委托在事件处理中的作用是作为事件订阅者和事件发布者之间的“桥梁”。它允许事件发布者将事件与特定的方法关联起来,并在适当的时机调用这些方法。

委托类型分为几种:

  • Action 委托类型:无返回值和参数的方法。
  • Func 委托类型:有一个返回值和最多16个参数的方法。
  • Predicate 委托类型:返回布尔值,并且接受一个参数的方法。

委托可以是单一委托,也可以是多播委托。多播委托可以将多个方法串联起来,一个事件可以被多个方法同时处理。

4.2 事件驱动编程实践

4.2.1 处理标准控件事件

在.NET框架中,控件类如 Button TextBox 等都有一些预定义的事件。例如,按钮(Button)有一个 Click 事件。当用户点击按钮时,会触发这个事件。开发者可以通过在事件处理程序中编写代码来响应这些事件。

要订阅一个事件,我们需要编写一个符合事件委托签名的方法,然后使用 += 操作符将其附加到事件。下面是一个按钮点击事件处理程序的示例:

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

然后将这个方法附加到按钮的 Click 事件上:

button1.Click += new EventHandler(button1_Click);

4.2.2 自定义事件和事件参数

在一些高级应用中,可能需要创建自定义事件。为此,我们需要定义一个事件参数类,并创建一个符合委托签名的事件处理方法。

下面是一个自定义事件的完整流程示例:

  1. 创建一个包含事件数据的类:
public class CustomEventArgs : EventArgs
{
    public string Message { get; set; }
}
  1. 声明事件:
public event EventHandler<CustomEventArgs> CustomEvent;
  1. 触发事件:
CustomEventArgs args = new CustomEventArgs();
args.Message = "Custom event occurred!";
OnCustomEvent(args);
  1. 定义 OnCustomEvent 方法来触发事件:
protected virtual void OnCustomEvent(CustomEventArgs e)
{
    CustomEvent?.Invoke(this, e);
}

这样,当 OnCustomEvent 被调用时,所有订阅 CustomEvent 的事件处理程序将被执行。

4.3 高级事件处理技巧

4.3.1 事件的冒泡与捕获

在图形界面中,事件冒泡和事件捕获通常用于元素间事件处理的控制。事件冒泡是指事件从最深层子元素开始,逐级向上传递至根元素的过程。事件捕获则是相反,事件从根元素开始,逐级向下传递至最深层子元素。

在.NET中,可以通过 Control 类的 Capture 属性来控制事件的捕获和冒泡。设置 Capture true 可以捕获事件,即在子元素处理事件前先由当前元素处理。事件处理方法可以通过 e.Handled 属性来标记事件是否已处理,防止事件继续冒泡。

4.3.2 多线程中的事件处理

在多线程应用程序中,事件处理需要特别的注意。由于事件可能在不同的线程中触发,我们需要确保事件的处理是在正确的线程上执行。.NET提供了 Control 类的 Invoke 方法,可以确保代码在正确的线程(通常是UI线程)上执行。

例如:

public void SomeEventFire(object sender, EventArgs e)
{
    if (this.InvokeRequired)
    {
        this.Invoke(new EventHandler(SomeEventFire), new object[] { sender, e });
    }
    else
    {
        // 处理事件的逻辑
    }
}

这段代码首先检查是否需要在UI线程上调用方法,如果是,则通过 Invoke 方法将方法调用委托给UI线程执行。

以上内容展示了C#事件处理的基础知识、实践和一些高级技巧。通过理解委托、事件以及如何处理它们,开发者可以创建响应用户操作或系统事件的高效应用程序。接下来,我们将进一步探讨数据绑定技术,使控件与数据源之间的交互变得更为流畅和直观。

5. 数据绑定技术

5.1 数据绑定基础

5.1.1 数据绑定的概念和好处

数据绑定是一种将用户界面(UI)元素与数据源连接起来的技术,允许UI控件自动更新以反映数据源中的更改,同时也允许用户界面的更改反映到数据源中。数据绑定的好处包括:

  • 降低耦合度: 通过数据绑定,UI代码与数据处理代码可以解耦,使得代码更加清晰,易于维护。
  • 减少样板代码: 使用数据绑定,开发者不需要手动编写代码来同步UI和数据源的状态,减少重复劳动。
  • 提高数据处理安全性: 当数据源更新时,绑定的UI会自动更新,避免了手动更新可能引入的数据不一致问题。

5.1.2 实现简单数据绑定

在C#中,数据绑定通常通过 Binding 类来实现。下面是一个简单的文本框与一个字符串变量进行绑定的例子:

using System;
using System.ComponentModel;
using System.Windows.Forms;

namespace SimpleDataBinding
{
    public partial class Form1 : Form
    {
        private string data = "初始值";

        public Form1()
        {
            InitializeComponent();
            // 设置数据源和绑定的属性
            textBox1.DataBindings.Add(new Binding("Text", this, "data", true, DataSourceUpdateMode.OnPropertyChanged));
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // 更新数据源
            data = "更新后的值";
        }
    }
}

在这个例子中, textBox1 文本框的 Text 属性被绑定到 Form1 类的 data 字段。当 data 字段的值改变时, textBox1 中的内容会自动更新。

5.2 高级数据绑定

5.2.1 绑定集合和复杂类型

在实际的应用程序中,经常需要绑定更复杂的对象和集合。以下是如何将 ListBox 控件与一个字符串列表进行绑定的示例:

using System;
using System.ComponentModel;
using System.Collections.Generic;
using System.Windows.Forms;

public class Form1 : Form
{
    private ListBox listBox1 = new ListBox();
    private BindingList<string> items = new BindingList<string>();

    public Form1()
    {
        InitializeComponent();
        // 绑定ListBox到items
        listBox1.DataSource = items;
    }

    private void buttonAdd_Click(object sender, EventArgs e)
    {
        // 添加新项到items集合
        items.Add("新条目");
    }
}

在这个例子中, ListBox 控件被绑定到 BindingList<string> 类型的集合 items ,这是一个实现了 IBindingList 接口的集合,它支持数据的动态更新。

5.2.2 数据绑定事件和错误处理

数据绑定过程中可能会遇到各种错误,例如数据格式不正确、绑定的数据源不可用等。可以使用 DataError 事件来处理这些错误:

private void textBox1_DataError(object sender, DataGridViewDataErrorEventArgs e)
{
    // 异常处理逻辑
    MessageBox.Show("数据绑定错误: " + e.Exception.Message);
    e.ThrowException = false; // 阻止异常传播
}

在这里,当 textBox1 控件的数据绑定过程中出现错误时,会触发 DataError 事件,然后我们可以在这里编写错误处理逻辑。

5.3 数据绑定与数据库交互

5.3.1 使用数据源控件

BindingSource 是.NET框架提供的一个数据源控件,它可以简化与数据源的交互。以下是如何使用 BindingSource 控件连接到数据库并绑定到一个网格视图(例如 DataGridView )的示例:

using System;
using System.Data;
using System.Data.SqlClient;
using System.Windows.Forms;

namespace DataSourceControl
{
    public partial class Form1 : Form
    {
        private DataGridView dataGridView1 = new DataGridView();
        private BindingSource bindingSource1 = new BindingSource();

        public Form1()
        {
            InitializeComponent();
            dataGridView1.DataSource = bindingSource1;
            bindingSource1.DataSource = GetSqlData();
        }

        private DataTable GetSqlData()
        {
            // 从数据库获取数据并返回DataTable
            string connectionString = "你的数据库连接字符串";
            string query = "SELECT * FROM 数据表名";
            DataTable table = new DataTable();
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                SqlCommand command = new SqlCommand(query, connection);
                SqlDataAdapter adapter = new SqlDataAdapter(command);
                adapter.Fill(table);
            }
            return table;
        }
    }
}

在这个例子中, BindingSource 控件作为中间桥梁连接数据库查询返回的 DataTable DataGridView 控件。

5.3.2 LINQ与数据绑定结合使用

LINQ(Language Integrated Query)是.NET语言中的集成查询功能,它提供了强大的数据查询能力。结合数据绑定,可以实现复杂的查询和数据显示:

using System.Linq;
using System.Windows.Forms;

// 假设有一个绑定到`DataGridView`的数据源
var query = from item in bindingSource1.DataSource.AsEnumerable()
            where item.Field<int>("Age") > 21
            select item;

dataGridView1.DataSource = query.ToList();

在这个例子中,我们对绑定到 DataGridView 的数据源进行筛选,只显示年龄大于21的记录,并将筛选后的结果重新绑定到 DataGridView

通过以上章节内容,我们对数据绑定技术有了基础到进阶的了解,并通过实际代码示例加深了对数据绑定在实际应用中的认识。下面将继续探讨下一章内容。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:本资源旨在引导初学者了解和学习C#编程语言,包括构建Windows桌面、Web应用和游戏开发等。资源集合了从基础到进阶的实例,强调实践学习,涵盖了Windows Forms开发的各个方面,如控件使用、事件处理、数据绑定、对话框应用、窗体设计、异常处理和多线程等。此外,还包含详细文档解释和编程最佳实践,帮助初学者快速掌握C#编程基础和建立项目开发的初步认识。


本文还有配套的精品资源,点击获取
menu-r.4af5f7ec.gif

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐