精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

C# DataGridView實(shí)戰(zhàn)攻略:從小白到高手的數(shù)據(jù)表格開發(fā)秘籍

開發(fā) 前端
本文將通過3個(gè)遞進(jìn)式的實(shí)戰(zhàn)案例,幫你解決數(shù)據(jù)綁定混亂、編輯功能不生效、數(shù)據(jù)庫集成踩坑等常見問題,讓你的WinForm應(yīng)用秒變專業(yè)級(jí)!

還在為WinForm數(shù)據(jù)展示發(fā)愁?還在被DataGridView的各種屬性搞得頭暈眼花?作為一個(gè)在數(shù)據(jù)表格開發(fā)路上摸爬滾打多年的老程序員,我深知DataGridView這個(gè)"看似簡單,實(shí)則復(fù)雜"的控件給無數(shù)C#開發(fā)者帶來的困擾。今天就來和大家分享一套完整的DataGridView實(shí)戰(zhàn)攻略,從基礎(chǔ)綁定到高級(jí)應(yīng)用,讓你徹底掌握這個(gè)強(qiáng)大的數(shù)據(jù)展示利器。

本文將通過3個(gè)遞進(jìn)式的實(shí)戰(zhàn)案例,幫你解決數(shù)據(jù)綁定混亂編輯功能不生效數(shù)據(jù)庫集成踩坑等常見問題,讓你的WinForm應(yīng)用秒變專業(yè)級(jí)!

DataGridView核心武器庫

在開始實(shí)戰(zhàn)之前,我們先來認(rèn)識(shí)一下DataGridView的幾個(gè)關(guān)鍵"武器":

必知核心屬性

// 數(shù)據(jù)源綁定 - 你的數(shù)據(jù)展示基礎(chǔ)
DataSource: 支持DataTable、DataSet、List<T>等多種數(shù)據(jù)源

// 自動(dòng)列生成控制 - 避免列顯示混亂的關(guān)鍵
AutoGenerateColumns: false// 強(qiáng)烈建議手動(dòng)控制列

// 用戶操作權(quán)限控制
ReadOnly: true/false// 是否允許編輯
AllowUserToAddRows: false// 是否允許用戶添加行
AllowUserToDeleteRows: false// 是否允許用戶刪除行

// 選擇模式設(shè)置
SelectionMode: FullRowSelect // 整行選擇,用戶體驗(yàn)更好

常用操作方法

// 列操作三件套
dataGridView.Columns.Add()    // 添加列
dataGridView.Columns.Remove() // 移除列  
dataGridView.Columns.Clear()  // 清空所有列

// 數(shù)據(jù)刷新
dataGridView.Refresh()        // 手動(dòng)刷新顯示

實(shí)戰(zhàn)案例一:基礎(chǔ)數(shù)據(jù)綁定 - 告別顯示混亂

很多初學(xué)者在數(shù)據(jù)綁定時(shí)經(jīng)常遇到"列顯示不正確"、"數(shù)據(jù)對不上號(hào)"等問題。這里有一個(gè)完整的解決方案:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AppDataGridViewBasic
{
    publicclass Person
    {
        publicstring Name { get; set; }
        publicint Age { get; set; }
        publicstring City { get; set; }
    }
}
namespace AppDataGridViewBasic
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            // 創(chuàng)建DataGridView實(shí)例
            DataGridView dataGridView = new DataGridView();
            this.Controls.Add(dataGridView);

            // ?? 關(guān)鍵配置:阻止自動(dòng)生成列
            dataGridView.AutoGenerateColumns = false;
            dataGridView.AllowUserToAddRows = false;
            dataGridView.Dock = DockStyle.Fill;
            dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect;

            // 步驟3:手動(dòng)創(chuàng)建列(避免顯示混亂)
            CreateColumns(dataGridView);

            // 步驟4:綁定數(shù)據(jù)源
            BindData(dataGridView);
        }

        private void CreateColumns(DataGridView dgv)
        {
            // 姓名列
            var nameColumn = new DataGridViewTextBoxColumn
            {
                DataPropertyName = "Name", // ?? 必須與模型屬性名一致
                HeaderText = "姓名",
                AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill
            };
            dgv.Columns.Add(nameColumn);

            // 年齡列
            var ageColumn = new DataGridViewTextBoxColumn
            {
                DataPropertyName = "Age",
                HeaderText = "年齡",
                Width = 80
            };
            dgv.Columns.Add(ageColumn);

            // 城市列
            var cityColumn = new DataGridViewTextBoxColumn
            {
                DataPropertyName = "City",
                HeaderText = "城市",
                AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill
            };
            dgv.Columns.Add(cityColumn);
        }

        private void BindData(DataGridView dgv)
        {
            var people = new List<Person>
            {
                new Person { Name = "張三", Age = 28, City = "北京" },
                new Person { Name = "李四", Age = 35, City = "上海" },
                new Person { Name = "王五", Age = 42, City = "廣州" }
            };

            // ?? 金句:數(shù)據(jù)綁定一行代碼搞定
            dgv.DataSource = people;
        }
    }
}

圖片圖片

避坑指南:

  • DataPropertyName必須與模型屬性名完全一致
  • 設(shè)置AutoGenerateColumns = false避免列重復(fù)
  • 使用AutoSizeMode.Fill讓列自適應(yīng)寬度

實(shí)戰(zhàn)案例二:實(shí)時(shí)編輯功能 - 讓數(shù)據(jù)"活"起來

單純展示數(shù)據(jù)太無聊?讓我們給DataGridView加上編輯功能,實(shí)現(xiàn)數(shù)據(jù)的實(shí)時(shí)更新:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace AppDataGridViewBasic
{
    public partial class Form2 : Form
    {
        // 數(shù)據(jù)源
        private List<Person> people;

        public Form2()
        {
            InitializeComponent();
            InitializeForm();
            LoadSampleData();
        }

        private void InitializeForm()
        {
            // ?? 開啟編輯模式的正確姿勢
            dataGridView.ReadOnly = false;

            // 注冊數(shù)據(jù)變更事件
            dataGridView.CellValueChanged += OnCellValueChanged;

            // ?? 關(guān)鍵:確保編輯完成后觸發(fā)事件
            dataGridView.CellEndEdit += OnCellEndEdit;

            // 單元格開始編輯事件
            dataGridView.CellBeginEdit += OnCellBeginEdit;

            // 數(shù)據(jù)錯(cuò)誤處理
            dataGridView.DataError += OnDataError;

            // 行刪除事件
            dataGridView.UserDeletingRow += OnUserDeletingRow;
        }

        private void LoadSampleData()
        {
            // ?? 初始化示例數(shù)據(jù)
            people = new List<Person>
            {
                new Person { Name = "張三", Age = 25, City = "北京", Email = "zhangsan@email.com", CreateDate = DateTime.Now.AddDays(-10) },
                new Person { Name = "李四", Age = 30, City = "上海", Email = "lisi@email.com", CreateDate = DateTime.Now.AddDays(-5) },
                new Person { Name = "王五", Age = 28, City = "廣州", Email = "wangwu@email.com", CreateDate = DateTime.Now.AddDays(-3) },
                new Person { Name = "趙六", Age = 35, City = "深圳", Email = "zhaoliu@email.com", CreateDate = DateTime.Now.AddDays(-1) }
            };

            // 綁定數(shù)據(jù)源
            dataGridView.DataSource = people;

            // ?? 列設(shè)置優(yōu)化
            SetupColumns();
        }

        private void SetupColumns()
        {
            if (dataGridView.Columns.Count > 0)
            {
                // 設(shè)置列標(biāo)題
                dataGridView.Columns["Name"].HeaderText = "姓名";
                dataGridView.Columns["Age"].HeaderText = "年齡";
                dataGridView.Columns["City"].HeaderText = "城市";
                dataGridView.Columns["Email"].HeaderText = "郵箱";
                dataGridView.Columns["CreateDate"].HeaderText = "創(chuàng)建時(shí)間";

                // 設(shè)置列寬比例
                dataGridView.Columns["Name"].FillWeight = 20;
                dataGridView.Columns["Age"].FillWeight = 15;
                dataGridView.Columns["City"].FillWeight = 20;
                dataGridView.Columns["Email"].FillWeight = 25;
                dataGridView.Columns["CreateDate"].FillWeight = 20;

                // 設(shè)置創(chuàng)建時(shí)間為只讀
                dataGridView.Columns["CreateDate"].ReadOnly = true;

                // 年齡列只允許數(shù)字
                dataGridView.Columns["Age"].ValueType = typeof(int);
            }
        }

        // ?? 核心事件處理方法
        private void OnCellValueChanged(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex < 0) return; // 避免標(biāo)題行觸發(fā)事件

            var dgv = sender as DataGridView;
            if (dgv.DataSource is List<Person> people && e.RowIndex < people.Count)
            {
                // 獲取被修改的對象
                Person updatedPerson = people[e.RowIndex];

                // ?? 實(shí)戰(zhàn)應(yīng)用:這里可以調(diào)用業(yè)務(wù)邏輯
                SavePersonToDatabase(updatedPerson);

                // 更新狀態(tài)欄或給用戶反饋
                this.Text = $"可編輯數(shù)據(jù)表格 - 已更新:{updatedPerson.Name} 的信息 [{DateTime.Now:HH:mm:ss}]";
            }
        }

        private void OnCellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            // 確保數(shù)據(jù)驗(yàn)證和格式化
            var dgv = sender as DataGridView;
            var cell = dgv[e.ColumnIndex, e.RowIndex];

            string columnName = dgv.Columns[e.ColumnIndex].Name;

            switch (columnName)
            {
                case"Age":
                    // 年齡列數(shù)據(jù)驗(yàn)證
                    if (!int.TryParse(cell.Value?.ToString(), out int age) || age < 0 || age > 150)
                    {
                        MessageBox.Show("請輸入有效的年齡(0-150)!", "數(shù)據(jù)驗(yàn)證", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                        cell.Value = 0; // 設(shè)置默認(rèn)值
                    }
                    break;

                case"Email":
                    // 郵箱格式驗(yàn)證
                    string email = cell.Value?.ToString();
                    if (!string.IsNullOrEmpty(email) && !IsValidEmail(email))
                    {
                        MessageBox.Show("請輸入有效的郵箱格式!", "數(shù)據(jù)驗(yàn)證", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                        cell.Value = ""; // 清空無效郵箱
                    }
                    break;

                case"Name":
                    // 姓名不能為空
                    if (string.IsNullOrWhiteSpace(cell.Value?.ToString()))
                    {
                        MessageBox.Show("姓名不能為空!", "數(shù)據(jù)驗(yàn)證", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                        cell.Value = "未命名";
                    }
                    break;
            }
        }

        private void OnCellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
        {
            // 可以在這里添加編輯前的邏輯
            var dgv = sender as DataGridView;
            string columnName = dgv.Columns[e.ColumnIndex].Name;

            // 例如:某些條件下禁止編輯
            if (columnName == "CreateDate")
            {
                e.Cancel = true; // 取消編輯
                MessageBox.Show("創(chuàng)建時(shí)間不可編輯!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        private void OnDataError(object sender, DataGridViewDataErrorEventArgs e)
        {
            // 處理數(shù)據(jù)類型轉(zhuǎn)換錯(cuò)誤等
            MessageBox.Show($"數(shù)據(jù)錯(cuò)誤:{e.Exception.Message}", "錯(cuò)誤", MessageBoxButtons.OK, MessageBoxIcon.Error);
            e.Cancel = true;
        }

        private void OnUserDeletingRow(object sender, DataGridViewRowCancelEventArgs e)
        {
            // 刪除行前的確認(rèn)
            if (MessageBox.Show("確定要?jiǎng)h除這條記錄嗎?", "確認(rèn)刪除",
                MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)
            {
                e.Cancel = true; // 取消刪除
            }
        }

        // ?? 收藏級(jí)代碼模板:數(shù)據(jù)保存方法
        private void SavePersonToDatabase(Person person)
        {
            try
            {
                // 這里實(shí)現(xiàn)你的數(shù)據(jù)保存邏輯
                // 可以是數(shù)據(jù)庫更新、API調(diào)用等
                Console.WriteLine($"保存數(shù)據(jù):{person.Name}, {person.Age}, {person.City}, {person.Email}");

                // 模擬異步保存
                Task.Run(() => {
                    System.Threading.Thread.Sleep(100); // 模擬網(wǎng)絡(luò)延遲
                    // 實(shí)際保存到數(shù)據(jù)庫的代碼
                });

            }
            catch (Exception ex)
            {
                MessageBox.Show($"保存失敗:{ex.Message}", "錯(cuò)誤", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        // ?? 按鈕事件處理
        private void BtnAdd_Click(object sender, EventArgs e)
        {
            // 添加新記錄
            people.Add(new Person
            {
                Name = "新用戶",
                Age = 20,
                City = "北京",
                Email = "new@email.com",
                CreateDate = DateTime.Now
            });

            // 刷新數(shù)據(jù)源
            RefreshDataSource();
        }

        private void BtnDelete_Click(object sender, EventArgs e)
        {
            // 刪除選中行
            if (dataGridView.SelectedRows.Count > 0)
            {
                var selectedIndex = dataGridView.SelectedRows[0].Index;
                if (selectedIndex < people.Count)
                {
                    if (MessageBox.Show("確定要?jiǎng)h除選中的記錄嗎?", "確認(rèn)刪除",
                        MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                    {
                        people.RemoveAt(selectedIndex);
                        RefreshDataSource();
                    }
                }
            }
            else
            {
                MessageBox.Show("請先選擇要?jiǎng)h除的行!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        private void BtnSaveAll_Click(object sender, EventArgs e)
        {
            // 保存所有數(shù)據(jù)
            try
            {
                foreach (var person in people)
                {
                    SavePersonToDatabase(person);
                }
                MessageBox.Show($"成功保存 {people.Count} 條記錄!", "保存成功",
                    MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch (Exception ex)
            {
                MessageBox.Show($"批量保存失敗:{ex.Message}", "錯(cuò)誤", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        // ?? 輔助方法
        private void RefreshDataSource()
        {
            dataGridView.DataSource = null;
            dataGridView.DataSource = people;
            SetupColumns();
        }

        private bool IsValidEmail(string email)
        {
            try
            {
                var addr = new System.Net.Mail.MailAddress(email);
                return addr.Address == email;
            }
            catch
            {
                returnfalse;
            }
        }

        private void Button_MouseEnter(object sender, EventArgs e)
        {
            if (sender is Button btn)
            {
                btn.FlatAppearance.BorderSize = 1;
                btn.FlatAppearance.BorderColor = System.Drawing.Color.White;
            }
        }

        private void Button_MouseLeave(object sender, EventArgs e)
        {
            if (sender is Button btn)
            {
                btn.FlatAppearance.BorderSize = 0;
            }
        }

        // ?? 窗體關(guān)閉時(shí)的清理工作
        protected override void OnFormClosed(FormClosedEventArgs e)
        {
            // 取消事件訂閱,避免內(nèi)存泄漏
            if (dataGridView != null)
            {
                dataGridView.CellValueChanged -= OnCellValueChanged;
                dataGridView.CellEndEdit -= OnCellEndEdit;
                dataGridView.CellBeginEdit -= OnCellBeginEdit;
                dataGridView.DataError -= OnDataError;
                dataGridView.UserDeletingRow -= OnUserDeletingRow;
            }

            base.OnFormClosed(e);
        }


    }
}

圖片圖片

編輯模式最佳實(shí)踐:

  • 同時(shí)監(jiān)聽CellValueChanged和CellEndEdit事件
  • 做好數(shù)據(jù)驗(yàn)證,避免無效數(shù)據(jù)
  • 提供用戶反饋,提升體驗(yàn)

實(shí)戰(zhàn)案例三:數(shù)據(jù)庫集成 - 企業(yè)級(jí)應(yīng)用必備

真實(shí)項(xiàng)目中,數(shù)據(jù)往往來自數(shù)據(jù)庫。下面展示如何實(shí)現(xiàn)DataGridView與數(shù)據(jù)庫的完美集成:

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

namespace AppDataGridViewBasic
{
    public partial class Form3 : Form
    {
        private DatabaseDataGridManager databaseManager;
        private readonly string connectionString = "Server=.;Database=dbtest;Integrated Security=true;";

        public Form3()
        {
            InitializeComponent();

        }

        private void InitializeForm()
        {
            try
            {
                // 初始化數(shù)據(jù)庫管理器
                databaseManager = new DatabaseDataGridManager(connectionString, dataGridView);

                // 加載數(shù)據(jù)
                databaseManager.LoadDataFromDatabase();

                // 更新狀態(tài)
                toolStripStatusLabel.Text = "? 數(shù)據(jù)庫連接成功,數(shù)據(jù)已加載";
            }
            catch (Exception ex)
            {
                MessageBox.Show($"初始化失敗:{ex.Message}", "錯(cuò)誤",
                    MessageBoxButtons.OK, MessageBoxIcon.Error);
                toolStripStatusLabel.Text = "? 數(shù)據(jù)庫連接失敗";
            }
        }

        // ?? 按鈕事件處理
        private void BtnRefresh_Click(object sender, EventArgs e)
        {
            try
            {
                databaseManager?.LoadDataFromDatabase();
                toolStripStatusLabel.Text = $"?? 數(shù)據(jù)已刷新 - {DateTime.Now:HH:mm:ss}";
            }
            catch (Exception ex)
            {
                MessageBox.Show($"刷新失敗:{ex.Message}", "錯(cuò)誤",
                    MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void BtnAddNew_Click(object sender, EventArgs e)
        {
            try
            {
                databaseManager?.AddNewRecord();
                toolStripStatusLabel.Text = $"? 新記錄已添加 - {DateTime.Now:HH:mm:ss}";
            }
            catch (Exception ex)
            {
                MessageBox.Show($"添加失敗:{ex.Message}", "錯(cuò)誤",
                    MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void BtnDelete_Click(object sender, EventArgs e)
        {
            try
            {
                if (dataGridView.SelectedRows.Count > 0)
                {
                    var result = MessageBox.Show("確定要?jiǎng)h除選中的記錄嗎?", "確認(rèn)刪除",
                        MessageBoxButtons.YesNo, MessageBoxIcon.Question);

                    if (result == DialogResult.Yes)
                    {
                        databaseManager?.DeleteSelectedRecord(dataGridView.SelectedRows[0].Index);
                        toolStripStatusLabel.Text = $"??? 記錄已刪除 - {DateTime.Now:HH:mm:ss}";
                    }
                }
                else
                {
                    MessageBox.Show("請先選擇要?jiǎng)h除的行!", "提示",
                        MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show($"刪除失敗:{ex.Message}", "錯(cuò)誤",
                    MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void BtnSaveChanges_Click(object sender, EventArgs e)
        {
            try
            {
                databaseManager?.SaveAllChanges();
                toolStripStatusLabel.Text = $"?? 所有更改已保存 - {DateTime.Now:HH:mm:ss}";
            }
            catch (Exception ex)
            {
                MessageBox.Show($"保存失敗:{ex.Message}", "錯(cuò)誤",
                    MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        // 按鈕懸停效果
        private void Button_MouseEnter(object sender, EventArgs e)
        {
            if (sender is Button btn)
            {
                btn.FlatAppearance.BorderSize = 1;
                btn.FlatAppearance.BorderColor = Color.White;
            }
        }

        private void Button_MouseLeave(object sender, EventArgs e)
        {
            if (sender is Button btn)
            {
                btn.FlatAppearance.BorderSize = 0;
            }
        }

        protected override void OnFormClosed(FormClosedEventArgs e)
        {
            databaseManager?.Dispose();
            base.OnFormClosed(e);
        }

        private void Form3_Load(object sender, EventArgs e)
        {
            InitializeForm();
        }
    }

    // ?? 企業(yè)級(jí)數(shù)據(jù)庫管理器
    publicclass DatabaseDataGridManager : IDisposable
    {
        private readonly string connectionString;
        private DataGridView dataGridView;
        private DataTable dataTable;
        private SqlDataAdapter dataAdapter;
        private SqlCommandBuilder commandBuilder;

        public DatabaseDataGridManager(string connStr, DataGridView dgv)
        {
            connectionString = connStr;
            dataGridView = dgv;
            InitializeDataGrid();
        }

        private void InitializeDataGrid()
        {
            // ?? 企業(yè)級(jí)配置
            dataGridView.AutoGenerateColumns = true; // 數(shù)據(jù)庫場景可以自動(dòng)生成
            dataGridView.ReadOnly = false;
            dataGridView.AllowUserToDeleteRows = false; // 安全起見
            dataGridView.AllowUserToAddRows = false; // 通過按鈕控制

            // 注冊事件
            dataGridView.CellValueChanged += OnDatabaseCellChanged;
            dataGridView.CellEndEdit += OnCellEndEdit;
        }

        // ?? 收藏級(jí)方法:加載數(shù)據(jù)庫數(shù)據(jù)
        public void LoadDataFromDatabase()
        {
            try
            {
                using (var connection = new SqlConnection(connectionString))
                {
                    // 創(chuàng)建適配器和命令構(gòu)建器
                    dataAdapter = new SqlDataAdapter("SELECT * FROM People ORDER BY Id", connection);
                    commandBuilder = new SqlCommandBuilder(dataAdapter);

                    dataTable = new DataTable();

                    // ?? 關(guān)鍵:Fill方法一次性完成連接、查詢、斷開
                    dataAdapter.Fill(dataTable);

                    dataGridView.DataSource = dataTable;

                    // 美化顯示
                    FormatColumns();
                }
            }
            catch (SqlException sqlEx)
            {
                if (sqlEx.Number == 2) // 服務(wù)器未找到
                {
                    thrownew Exception("無法連接到SQL Server,請檢查服務(wù)器是否運(yùn)行");
                }
                elseif (sqlEx.Number == 208) // 表不存在
                {
                    CreateSampleTable();
                    LoadDataFromDatabase(); // 重新加載
                }
                else
                {
                    thrownew Exception($"數(shù)據(jù)庫錯(cuò)誤:{sqlEx.Message}");
                }
            }
            catch (Exception ex)
            {
                thrownew Exception($"數(shù)據(jù)加載失敗:{ex.Message}");
            }
        }

        private void CreateSampleTable()
        {
            try
            {
                using (var connection = new SqlConnection(connectionString))
                {
                    connection.Open();

                    var createTableCommand = new SqlCommand(@"
                        IF NOT EXISTS (SELECT * FROM sysobjects WHERE name='People' AND xtype='U')
                        CREATE TABLE People (
                            Id INT IDENTITY(1,1) PRIMARY KEY,
                            Name NVARCHAR(50) NOT NULL,
                            Age INT NOT NULL,
                            City NVARCHAR(50),
                            Email NVARCHAR(100),
                            CreateDate DATETIME DEFAULT GETDATE()
                        )", connection);

                    createTableCommand.ExecuteNonQuery();

                    // 插入示例數(shù)據(jù)
                    var insertCommand = new SqlCommand(@"
                        INSERT INTO People (Name, Age, City, Email) VALUES
                        (N'張三', 25, N'北京', 'zhangsan@email.com'),
                        (N'李四', 30, N'上海', 'lisi@email.com'),
                        (N'王五', 28, N'廣州', 'wangwu@email.com'),
                        (N'趙六', 35, N'深圳', 'zhaoliu@email.com')", connection);

                    insertCommand.ExecuteNonQuery();
                }
            }
            catch (Exception ex)
            {
                thrownew Exception($"創(chuàng)建示例表失敗:{ex.Message}");
            }
        }

        private void FormatColumns()
        {
            // 等待列生成完成
            if (dataGridView.Columns.Count == 0)
            {
                dataGridView.Refresh();
                Application.DoEvents(); // 確保UI更新完成
            }

            try
            {
                // ?? 安全檢查每一列
                var idColumn = dataGridView.Columns["Id"];
                if (idColumn != null)
                {
                    idColumn.HeaderText = "編號(hào)";
                    idColumn.ReadOnly = true;
                    idColumn.DefaultCellStyle.BackColor = Color.LightGray;
                    idColumn.Width = 60;
                }

                var nameColumn = dataGridView.Columns["Name"];
                if (nameColumn != null)
                {
                    nameColumn.HeaderText = "姓名";
                    nameColumn.Width = 100;
                }

                var ageColumn = dataGridView.Columns["Age"];
                if (ageColumn != null)
                {
                    ageColumn.HeaderText = "年齡";
                    ageColumn.Width = 60;
                }

                var cityColumn = dataGridView.Columns["City"];
                if (cityColumn != null)
                {
                    cityColumn.HeaderText = "城市";
                    cityColumn.Width = 100;
                }

                var emailColumn = dataGridView.Columns["Email"];
                if (emailColumn != null)
                {
                    emailColumn.HeaderText = "郵箱";
                    emailColumn.Width = 150;
                }

                var createDateColumn = dataGridView.Columns["CreateDate"];
                if (createDateColumn != null)
                {
                    createDateColumn.HeaderText = "創(chuàng)建時(shí)間";
                    createDateColumn.ReadOnly = true;
                    createDateColumn.DefaultCellStyle.Format = "yyyy-MM-dd HH:mm:ss";
                }
            }
            catch (Exception ex)
            {
                // 記錄日志但不中斷程序
                System.Diagnostics.Debug.WriteLine($"列格式化警告: {ex.Message}");
            }
        }

        private void OnDatabaseCellChanged(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex < 0) return;

            try
            {
                // 標(biāo)記行為已修改
                DataRow modifiedRow = dataTable.Rows[e.RowIndex];
                // DataRow會(huì)自動(dòng)跟蹤更改狀態(tài)
            }
            catch (Exception ex)
            {
                MessageBox.Show($"數(shù)據(jù)更改失敗:{ex.Message}", "錯(cuò)誤");
                // 回滾更改
                dataTable.RejectChanges();
                dataGridView.Refresh();
            }
        }

        private void OnCellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            var dgv = sender as DataGridView;
            var cell = dgv[e.ColumnIndex, e.RowIndex];
            string columnName = dgv.Columns[e.ColumnIndex].Name;

            // 數(shù)據(jù)驗(yàn)證
            switch (columnName)
            {
                case"Age":
                    if (!int.TryParse(cell.Value?.ToString(), out int age) || age < 0 || age > 150)
                    {
                        MessageBox.Show("請輸入有效的年齡(0-150)!", "數(shù)據(jù)驗(yàn)證");
                        cell.Value = DBNull.Value;
                        return;
                    }
                    break;
                case"Name":
                    if (string.IsNullOrWhiteSpace(cell.Value?.ToString()))
                    {
                        MessageBox.Show("姓名不能為空!", "數(shù)據(jù)驗(yàn)證");
                        cell.Value = "未命名";
                        return;
                    }
                    break;
                case"Email":
                    string email = cell.Value?.ToString();
                    if (!string.IsNullOrEmpty(email) && !IsValidEmail(email))
                    {
                        MessageBox.Show("請輸入有效的郵箱格式!", "數(shù)據(jù)驗(yàn)證");
                        cell.Value = DBNull.Value;
                        return;
                    }
                    break;
            }
        }

        // ?? 企業(yè)級(jí)更新方法:批量保存所有更改
        public void SaveAllChanges()
        {
            try
            {
                if (dataAdapter != null && dataTable != null)
                {
                    // ?? 重新創(chuàng)建連接和適配器
                    using (var connection = new SqlConnection(connectionString))
                    {
                        // 重新設(shè)置適配器的連接
                        dataAdapter.SelectCommand.Connection = connection;

                        // 重新生成Insert、Update、Delete命令
                        commandBuilder = new SqlCommandBuilder(dataAdapter);

                        // 執(zhí)行更新
                        dataAdapter.Update(dataTable);
                        dataTable.AcceptChanges();
                    }
                }
            }
            catch (Exception ex)
            {
                thrownew Exception($"保存失敗:{ex.Message}");
            }
        }

        public void AddNewRecord()
        {
            try
            {
                DataRow newRow = dataTable.NewRow();
                newRow["Name"] = "新用戶";
                newRow["Age"] = 20;
                newRow["City"] = "北京";
                newRow["Email"] = "new@email.com";

                dataTable.Rows.Add(newRow);
            }
            catch (Exception ex)
            {
                thrownew Exception($"添加記錄失敗:{ex.Message}");
            }
        }

        public void DeleteSelectedRecord(int rowIndex)
        {
            try
            {
                if (rowIndex >= 0 && rowIndex < dataTable.Rows.Count)
                {
                    dataTable.Rows[rowIndex].Delete();
                }
            }
            catch (Exception ex)
            {
                thrownew Exception($"刪除記錄失敗:{ex.Message}");
            }
        }

        private bool IsValidEmail(string email)
        {
            try
            {
                var addr = new System.Net.Mail.MailAddress(email);
                return addr.Address == email;
            }
            catch
            {
                returnfalse;
            }
        }

        public void Dispose()
        {
            dataAdapter?.Dispose();
            commandBuilder?.Dispose();
            dataTable?.Dispose();

            if (dataGridView != null)
            {
                dataGridView.CellValueChanged -= OnDatabaseCellChanged;
                dataGridView.CellEndEdit -= OnCellEndEdit;
            }
        }
    }
}

圖片圖片

數(shù)據(jù)庫集成避坑指南:

  • 使用using語句確保連接正確釋放
  • 做好異常處理,避免程序崩潰
  • 實(shí)現(xiàn)數(shù)據(jù)回滾機(jī)制,保證數(shù)據(jù)一致性

高手進(jìn)階技巧

性能優(yōu)化秘籍

// 大量數(shù)據(jù)加載時(shí)暫停重繪,提升性能
dataGridView.SuspendLayout();
// ... 進(jìn)行數(shù)據(jù)操作
dataGridView.ResumeLayout();

// 虛擬模式處理海量數(shù)據(jù)
dataGridView.VirtualMode = true;

用戶體驗(yàn)增強(qiáng)

// 隔行變色
dataGridView.AlternatingRowsDefaultCellStyle.BackColor = Color.LightGray;

// 鼠標(biāo)懸停高亮
dataGridView.DefaultCellStyle.SelectionBackColor = Color.DodgerBlue;

總結(jié):掌握DataGridView的三個(gè)關(guān)鍵點(diǎn)

通過以上三個(gè)遞進(jìn)式案例,相信你已經(jīng)對DataGridView有了全面的認(rèn)識(shí)。讓我來總結(jié)三個(gè)最重要的要點(diǎn):

  1. 數(shù)據(jù)綁定的正確姿勢手動(dòng)控制列生成,避免顯示混亂
  2. 編輯功能的完整實(shí)現(xiàn)事件處理+數(shù)據(jù)驗(yàn)證+用戶反饋
  3. 數(shù)據(jù)庫集成的企業(yè)級(jí)方案異常處理+事務(wù)管理+性能優(yōu)化

DataGridView雖然功能強(qiáng)大,但掌握了正確的使用方法,它就會(huì)成為你開發(fā)WinForm應(yīng)用的得力助手。記住,實(shí)踐是最好的老師,建議大家把這些代碼在自己的項(xiàng)目中跑一遍,相信會(huì)有更深的理解!

責(zé)任編輯:武曉燕 來源: 技術(shù)老小子
相關(guān)推薦

2023-11-02 08:53:26

閉包Python

2017-07-11 09:35:10

大數(shù)據(jù)linuxjava

2023-06-09 00:09:46

MySQL分庫分表

2017-10-10 17:36:14

大數(shù)據(jù)語言人工智能

2018-06-19 14:07:04

Python編程開發(fā)面向?qū)ο?/a>

2025-11-06 00:05:00

2009-05-21 09:28:20

C#DatagridVie操作

2025-03-25 09:00:00

2017-08-10 13:43:00

大數(shù)據(jù)數(shù)據(jù)表格優(yōu)化設(shè)計(jì)

2020-11-05 08:14:17

鏈表

2025-02-14 00:00:20

C#C/C++語言

2023-11-08 09:10:23

pytestPython

2024-06-20 09:58:19

C#Attribute元數(shù)據(jù)機(jī)制

2009-08-19 10:46:48

C#操作Word表格

2009-08-19 10:42:08

C#操作Word表格

2019-08-16 09:55:22

Pandas編程語言代碼

2009-04-09 09:19:25

C#規(guī)則表達(dá)式.NET

2025-04-27 08:20:00

前端配置文件開發(fā)

2009-08-12 18:16:47

C#類型比較

2021-08-26 06:58:15

Docker容器數(shù)據(jù)卷
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

麻豆精品新av中文字幕| 精品日产免费二区日产免费二区| 一卡二卡三卡日韩欧美| 成人情视频高清免费观看电影| 伊人365影院| 亚洲资源网站| 欧美一级在线观看| 丰满爆乳一区二区三区| 99se视频在线观看| 粉嫩aⅴ一区二区三区四区五区| 91精品国产91久久久久| 欧美精品日韩在线| 福利欧美精品在线| 欧美日韩精品一区二区天天拍小说| 午夜在线视频免费观看| 亚洲人视频在线观看| 精品无人码麻豆乱码1区2区| 91国语精品自产拍在线观看性色 | 91在线视频18| 91在线精品视频| 男人天堂视频在线| 亚洲看片免费| 大胆欧美人体视频| 91在线视频免费| 免费看黄在线看| 成人免费在线观看| 99在线精品观看| 亚洲va久久久噜噜噜| 69av视频在线观看| 国产欧美大片| 欧美激情一区二区三区在线视频观看| 天天操天天摸天天舔| 亚洲资源网站| 亚洲精品国产精品久久清纯直播 | 日本网站免费在线观看| 一二三四区在线观看| 国产精品欧美一区二区三区| 久久综合中文色婷婷| 天堂国产一区二区三区| 国产精品亚洲人在线观看| 国产欧美日韩免费看aⅴ视频| 一本一道无码中文字幕精品热| 国产综合精品| 久热精品视频在线| 中文字幕求饶的少妇| 成人看的羞羞网站| 亚洲午夜未满十八勿入免费观看全集| 日本xxx在线播放| 国产三级精品三级在线观看国产| 日韩午夜三级在线| av地址在线观看| 免费观看亚洲视频大全| 欧美一区二区在线看| 亚洲网中文字幕| 国产95亚洲| 91精品国产色综合久久不卡电影 | 91theporn国产在线观看| 日日摸夜夜添夜夜添亚洲女人| 日本乱人伦a精品| 国产性生活视频| 久热精品在线| 国产精品视频导航| 91麻豆一区二区| 国产一区二区不卡| 亚洲xxx自由成熟| 亚洲国产精品久久人人爱潘金莲| 国产精品一区二区不卡| 91久久精品国产91久久性色tv| 国产91视频在线| 成人黄色av网站在线| 精品久久久久亚洲| 国产免费av高清在线| 日本一区二区免费在线观看视频 | 丝袜美腿亚洲一区| 日韩免费精品视频| 中文字幕在线观看免费| 国产麻豆欧美日韩一区| 国产一级二级三级精品| 男女污视频在线观看| 中文无字幕一区二区三区| 中文字幕一区二区三区5566| 羞羞电影在线观看www| 亚洲成人一区在线| 少妇激情一区二区三区| 奇米一区二区| 国产丝袜一区二区三区| 国产精品18在线| 欧美1级日本1级| 91精品国产91久久久久久久久| 成人一级免费视频| 国产福利一区二区| 欧美一区二区综合| 羞羞视频在线免费国产| 一本大道av伊人久久综合| 视频免费1区二区三区| 欧美绝顶高潮抽搐喷水合集| 色综久久综合桃花网| 国产一级做a爱免费视频| 久久久久91| 999在线观看免费大全电视剧| 日韩在线无毛| 亚洲欧美日韩在线不卡| 国产精品视频一区二区三区四区五区 | 三级小说欧洲区亚洲区| www.日韩免费| 国产成人精品777777| 国产成人综合在线观看| 色一情一乱一伦一区二区三区丨| 久久香蕉av| 欧美精品xxxxbbbb| www.av欧美| 精品69视频一区二区三区Q| 国产精品一区二区三区免费视频 | 1769国产精品视频| 中文字幕日韩欧美在线| xxxx.国产| 国产精品一区二区在线观看不卡| 欧洲精品久久| 涩涩视频在线| 精品91自产拍在线观看一区| 亚洲熟女少妇一区二区| 久久综合狠狠| 国产一区精品在线| 男女免费观看在线爽爽爽视频| 欧美日韩色一区| 久久亚洲AV无码专区成人国产| 亚洲第一精品影视| 91丝袜脚交足在线播放| 欧美成年黄网站色视频| 欧美亚洲综合另类| 久久成人激情视频| 免费在线亚洲| 精品欧美一区二区三区久久久 | 欧美国产偷国产精品三区| 91po在线观看91精品国产性色| 国产富婆一级全黄大片| 亚洲日本一区二区三区| 一个色综合久久| 久久电影院7| 国产精品激情自拍| 成年人视频网站在线| 色婷婷久久久综合中文字幕| 五月婷婷综合在线观看| 亚洲欧美成人| 免费一区二区三区在在线视频| 欧美13videosex性极品| 亚洲国产中文字幕在线观看| 国产极品在线播放| av一区二区三区四区| 国产av天堂无码一区二区三区| 超碰97久久国产精品牛牛| 久久久久九九九九| 丁香花免费高清完整在线播放| 亚洲一区二区黄色| av无码一区二区三区| 亚洲欧美日韩一区在线观看| 久久精品99久久| 色老太综合网| 在线观看久久久久久| 亚洲天堂网在线视频| 国产精品毛片无遮挡高清| 日韩精品视频一二三| 香蕉国产精品| 成人午夜电影在线播放| 美女扒开腿让男人桶爽久久软| 精品一区电影国产| 探花国产精品一区二区| 亚洲欧洲国产日本综合| 久久久国产精品久久久| 亚洲三级免费| 日韩欧美三级一区二区| 日韩一级视频| 欧美黄色成人网| 三级国产在线观看| 欧美日韩1区2区| 免费人成年激情视频在线观看| 北条麻妃一区二区三区| 国内外成人免费激情视频| 日本一二区不卡| 91传媒免费看| 在线精品亚洲欧美日韩国产| 色哟哟入口国产精品| 国精产品乱码一区一区三区四区| 欧美日韩在线影院| 国产精品高清无码在线观看| 韩国精品在线观看| 欧美一区二区中文字幕| 日韩在线不卡| 国产精品日韩一区二区三区| 一二区成人影院电影网| 欧美日韩国产成人在线| 黄色的视频在线免费观看| 91精品黄色片免费大全| av大片在线免费观看| 亚洲欧洲精品一区二区三区| 国产熟女高潮一区二区三区| 久久er精品视频| 国产黄视频在线| 综合一区av| 欧美连裤袜在线视频| 日本精品视频| 国产精品xxxxx| free性欧美16hd| 最近中文字幕mv在线一区二区三区四区 | 久久久久久久蜜桃| 国产人成亚洲第一网站在线播放| 国偷自产av一区二区三区麻豆| 日韩经典一区二区| 国产男女免费视频| 亚洲欧美偷拍自拍| 日韩欧美视频第二区| 欧洲亚洲一区二区三区| 91在线观看免费| 福利精品一区| 国产成人高清激情视频在线观看 | 女同性一区二区三区人了人一| 青青成人在线| 欧美调教在线| 国产精品免费一区二区三区在线观看| 亚洲国产综合在线观看| 国产精品久久久久7777婷婷| 国产传媒av在线| 欧美激情第1页| 高潮毛片在线观看| 日韩最新在线视频| av免费观看一区二区| 精品一区二区三区电影| 囯产精品久久久久久| 91精品国产综合久久国产大片| 中文字幕一区二区三区四区免费看| 亚洲国产精品久久人人爱| 青草草在线视频| 亚洲色欲色欲www在线观看| 又嫩又硬又黄又爽的视频| 国产午夜精品一区二区三区四区 | 老牛影视av牛牛影视av| 日韩一区二区视频| 国产日韩欧美中文字幕| 制服丝袜亚洲色图| 在线亚洲欧美日韩| 精品视频一区三区九区| 亚洲性猛交富婆| 在线看国产一区| 中文天堂在线播放| 欧美日韩综合色| 亚洲天堂免费av| 在线不卡中文字幕播放| 国产裸体永久免费无遮挡| 8v天堂国产在线一区二区| 一炮成瘾1v1高h| 777久久久精品| 一区二区日韩视频| 日韩亚洲欧美高清| 亚洲第一成人av| 亚洲国产天堂网精品网站| 手机在线精品视频| 日韩精品在线观| 你懂的在线播放| 中文字幕亚洲一区在线观看 | 神马久久久久久久久久| 亚洲国产精品va在线看黑人| 天天操天天干天天爽| 精品香蕉一区二区三区| chinese偷拍一区二区三区| 自拍亚洲一区欧美另类| av在线网址观看| 性亚洲最疯狂xxxx高清| 黑人巨大亚洲一区二区久 | 欧美激情图片区| 黄色激情在线播放| 国产精品久久77777| av在线亚洲一区| 国产成人免费观看| 欧美美女在线观看| 中日韩在线视频| 亚洲午夜极品| 苍井空浴缸大战猛男120分钟| 美女视频网站久久| 亚洲女则毛耸耸bbw| 久久久www免费人成精品| 国精产品一区一区二区三区mba| 亚洲一区在线观看免费| 伊人中文字幕在线观看| 制服丝袜亚洲播放| 蜜桃视频在线免费| 久久中文字幕在线视频| 黄色aa久久| 95av在线视频| 欧美人妖在线| 人妻激情另类乱人伦人妻| 久久久久欧美精品| 中文字幕avav| 国产日韩亚洲欧美综合| 九九九免费视频| 欧美又粗又大又爽| 欧美一级淫片免费视频魅影视频| 在线播放国产精品| av电影在线地址| 成人激情在线观看| 日韩精品福利一区二区三区| 一区二区三区日韩视频| 免费看的黄色欧美网站| 佐山爱在线视频| 日本一区二区久久| 亚洲一区欧美在线| 欧美一区二区三区免费大片| 蝌蚪视频在线播放| 欧美精品九九久久| 精品91福利视频| 亚洲成色最大综合在线| 久久国产精品久久w女人spa| 九九九久久久久久久| 欧美高清在线视频| 销魂美女一区二区| 日韩成人免费视频| 国内在线免费视频| 91精品一区二区| 欧美系列电影免费观看| 日韩激情免费视频| 成人av网址在线| 国产在线拍揄自揄拍无码视频| 欧美猛男男办公室激情| 成人亚洲综合天堂| 国产精品96久久久久久| 天天躁日日躁狠狠躁欧美| 欧美狂野激情性xxxx在线观| 国产在线一区二区| 久艹在线观看视频| 这里只有精品电影| 日本在线看片免费人成视1000| 国产精品高潮呻吟久久av无限| 天天躁日日躁狠狠躁欧美| 欧美黑人经典片免费观看| 本田岬高潮一区二区三区| 国产精品suv一区二区69| 日韩精品一区二区三区在线| 在线看福利影| dy888夜精品国产专区| 欧美久久一级| 中文字幕天堂av| 亚洲高清视频在线| 香蕉人妻av久久久久天天| 久久久久久久av| 国产精品白丝一区二区三区 | 奇米影视一区二区三区小说| 精品无人区无码乱码毛片国产 | 久久综合影院| 狠狠热免费视频| 国产精品视频看| 国产一区二区女内射| 欧美成人精品xxx| 中文字幕亚洲在线观看| 9色porny| 99久久久国产精品免费蜜臀| 国产精品自拍99| 亚洲丝袜av一区| 欧美一区二区三区婷婷| 成人性做爰片免费视频| 粉嫩av一区二区三区| 日韩av黄色片| 亚洲欧美国产精品| 国产精品99精品一区二区三区∴| 欧美aaa在线观看| 国产91高潮流白浆在线麻豆| 中文字幕在线观看免费视频| 精品亚洲国产视频| 久久69成人| 老司机激情视频| 2021久久国产精品不只是精品| 337p粉嫩色噜噜噜大肥臀| 久久精品男人天堂| 国产美女撒尿一区二区| 国产嫩草在线观看| 亚洲精品成人少妇| 天天av综合网| 成人黄色av网站| 99综合精品| 国产一区在线观看免费| 亚洲国产精品va| 欧美91在线|欧美| av在线com| 亚洲国产精华液网站w| 亚洲第一页综合| 国产999精品久久久| 午夜日韩视频| 国产人妻大战黑人20p| 欧美一区二区三区的| 周于希免费高清在线观看| 在线播放 亚洲| 91啪九色porn原创视频在线观看| 亚洲一区中文字幕在线| 韩剧1988在线观看免费完整版 | 成年人深夜视频| 中文字幕电影一区| 日本久久一级片| 国产日韩欧美在线视频观看| 9久re热视频在线精品| 国产高清视频免费在线观看| 日韩高清有码在线| 亚洲一区二区三区在线免费|