myesn

myEsn2E9

hi
github

Windows Forms 使用 DataGridView 完成 CURD

使用 DataGridView 控件展示数据(内存),完成一个 Minimum CRUD Demo:

DataGridViewExtentions.cs#

using System.Reflection;

namespace ConsoleApp.WindowsFormTests
{
    public static class ExtensionMethods
    {
        // 启用双缓冲机制,减少 UI 控件重绘时的闪烁现象
        public static void DoubleBuffered(this DataGridView dgv, bool setting)
        {
            Type dgvType = dgv.GetType();
            PropertyInfo? pi = dgvType.GetProperty("DoubleBuffered", BindingFlags.Instance | BindingFlags.NonPublic);
            pi!.SetValue(dgv, setting, null);
        }
    }
}

FrmMain.cs#

using System.Data;

namespace ConsoleApp.WindowsFormTests
{
    public partial class FrmMain : Form
    {
        public FrmMain()
        {
            InitializeComponent();
        }

        private readonly DataTable _dataTable = new();

        private void FrmMain_Load(object sender, EventArgs e)
        {
            InitialDataTable();
            InitalDataGridView();

            btnAdd.Click += BtnAdd_Click;
            btnUpdate.Click += BtnUpdate_Click;
            btnDelete.Click += BtnDelete_Click;
        }

        private void BtnDelete_Click(object? sender, EventArgs e)
        {
            if (!AnySelectedRow())
            {
                MessageBox.Show("请先选择要删除的行");
                return;
            }

            var row = GetSelectedRow();
            var id = row.Cells["Id"].Value;
            var nickName = row.Cells["NickName"].Value;

            var dialogResult = MessageBox.Show($"确定要删除 {nickName} 吗?", "删除确认", MessageBoxButtons.YesNo);
            if (dialogResult == DialogResult.No) return;

            DeleteDataRow(id);
            ClearDataGridViewSelection();
        }

        private void BtnUpdate_Click(object? sender, EventArgs e)
        {
            if (!AnySelectedRow())
            {
                MessageBox.Show("请先选择要修改的行");
                return;
            }

            var nickName = txtNickName.Text.Trim();
            if (string.IsNullOrWhiteSpace(nickName))
            {
                txtNickName.Focus();
                return;
            }

            var id = GetSelectedRow().Cells["Id"].Value;

            UpdateDataRow(id!, nickName);
        }
        private void BtnAdd_Click(object? sender, EventArgs e)
        {
            var nickName = txtNickName.Text.Trim();
            if (string.IsNullOrWhiteSpace(nickName))
            {
                txtNickName.Focus();
                return;
            }
            dataGridView1.ClearSelection();
            AddDataRow(nickName);

            // 首次添加数据,dataGridView 会选中第一条数据,这里清除默认选中的行为
            if (_dataTable.Rows.Count == 1)
            {
                ClearDataGridViewSelection();
            }

            txtNickName.Clear();
            txtNickName.Focus();
        }
        private void DataGridView1_SelectionChanged(object? sender, EventArgs e)
        {
            if (!AnySelectedRow()) return;

            var selectedRow = GetSelectedRow();
            txtNickName.Text = selectedRow.Cells["NickName"].Value.ToString();
        }

        private void AddDataRow(string nickName)
        {
            _dataTable.Rows.Add(Guid.NewGuid(), nickName);
        }
        private void UpdateDataRow(object? key, string nickName)
        {
            var row = _dataTable.Rows.Find(key);
            row!["NickName"] = nickName;
        }
        private void DeleteDataRow(object? key)
        {
            var row = _dataTable.Rows.Find(key);
            row!.Delete();
        }
        private void InitialDataTable()
        {
            var idColumn = _dataTable.Columns.Add("Id");
            _dataTable.Columns.Add("NickName");
            _dataTable.PrimaryKey = new DataColumn[] { idColumn };
        }
        private void InitalDataGridView()
        {
            dataGridView1.DataSource = _dataTable;
            dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
            dataGridView1.MultiSelect = false;
            dataGridView1.DoubleBuffered(true);

            dataGridView1.RowPrePaint += DataGridView1_RowPrePaint;
            dataGridView1.SelectionChanged += DataGridView1_SelectionChanged;
        }
        private void ClearDataGridViewSelection()
        {
            dataGridView1.ClearSelection();
            dataGridView1.CurrentCell = null;
        }
        private bool AnySelectedRow() => dataGridView1.CurrentRow != null;
        private DataGridViewRow GetSelectedRow() => dataGridView1.CurrentRow;
        // 阻止绘制焦点样式,改善视觉效果,使行在没有焦点时看起来更加一致或符合设计需求
        private void DataGridView1_RowPrePaint(object? sender, DataGridViewRowPrePaintEventArgs e) => e.PaintParts &= ~DataGridViewPaintParts.Focus;
    }
}

FrmMain.Designer.cs#

namespace ConsoleApp.WindowsFormTests
{
    partial class FrmMain
    {
        /// <summary>
        ///  Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        ///  Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code

        /// <summary>
        ///  Required method for Designer support - do not modify
        ///  the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            txtNickName = new TextBox();
            btnAdd = new Button();
            dataGridView1 = new DataGridView();
            btnUpdate = new Button();
            btnDelete = new Button();
            ((System.ComponentModel.ISupportInitialize)dataGridView1).BeginInit();
            SuspendLayout();
            // 
            // txtNickName
            // 
            txtNickName.Location = new Point(71, 47);
            txtNickName.Name = "txtNickName";
            txtNickName.Size = new Size(125, 27);
            txtNickName.TabIndex = 0;
            // 
            // btnAdd
            // 
            btnAdd.Location = new Point(235, 44);
            btnAdd.Name = "btnAdd";
            btnAdd.Size = new Size(114, 33);
            btnAdd.TabIndex = 1;
            btnAdd.Text = "Add";
            btnAdd.UseVisualStyleBackColor = true;
            // 
            // dataGridView1
            // 
            dataGridView1.AllowUserToAddRows = false;
            dataGridView1.AllowUserToDeleteRows = false;
            dataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
            dataGridView1.Dock = DockStyle.Bottom;
            dataGridView1.Location = new Point(0, 116);
            dataGridView1.Name = "dataGridView1";
            dataGridView1.ReadOnly = true;
            dataGridView1.RowHeadersWidth = 51;
            dataGridView1.Size = new Size(710, 392);
            dataGridView1.TabIndex = 2;
            // 
            // btnUpdate
            // 
            btnUpdate.Location = new Point(374, 44);
            btnUpdate.Name = "btnUpdate";
            btnUpdate.Size = new Size(114, 33);
            btnUpdate.TabIndex = 3;
            btnUpdate.Text = "Update";
            btnUpdate.UseVisualStyleBackColor = true;
            // 
            // btnDelete
            // 
            btnDelete.Location = new Point(513, 44);
            btnDelete.Name = "btnDelete";
            btnDelete.Size = new Size(114, 33);
            btnDelete.TabIndex = 4;
            btnDelete.Text = "Delete";
            btnDelete.UseVisualStyleBackColor = true;
            // 
            // FrmMain
            // 
            AcceptButton = btnAdd;
            AutoScaleDimensions = new SizeF(9F, 20F);
            AutoScaleMode = AutoScaleMode.Font;
            ClientSize = new Size(710, 508);
            Controls.Add(btnDelete);
            Controls.Add(btnUpdate);
            Controls.Add(dataGridView1);
            Controls.Add(btnAdd);
            Controls.Add(txtNickName);
            FormBorderStyle = FormBorderStyle.FixedSingle;
            Name = "FrmMain";
            StartPosition = FormStartPosition.CenterScreen;
            Text = "Main";
            Load += FrmMain_Load;
            ((System.ComponentModel.ISupportInitialize)dataGridView1).EndInit();
            ResumeLayout(false);
            PerformLayout();
        }

        #endregion

        private TextBox txtNickName;
        private Button btnAdd;
        private DataGridView dataGridView1;
        private Button btnUpdate;
        private Button btnDelete;
    }
}
Loading...
Ownership of this post data is guaranteed by blockchain and smart contracts to the creator alone.