WinForm DataGridView雙向數據綁定

来源:https://www.cnblogs.com/it89/archive/2019/01/15/10274852.html
-Advertisement-
Play Games

程式目標: 實現DataGridView與BindingList<T>雙向綁定。用戶通過DataGridView修改值後立即更新BindList對象的值,代碼修改BindList後立即更新DataGridView的顯示。 實現環境:vs2017 C# WinForm Code: 1 ///***** ...


程式目標:

  實現DataGridView與BindingList<T>雙向綁定。用戶通過DataGridView修改值後立即更新BindList對象的值,代碼修改BindList後立即更新DataGridView的顯示。

實現環境:vs2017 C# WinForm

程式完整代碼包:https://pan.baidu.com/s/1LLUxL1UyqNWkXkPF_LuEig

主要代碼:

  1 ///****************************************************************************
  2 /// CLR版本     :4.0.30319.42000
  3 /// 郵    箱    :[email protected]
  4 /// 博    客    :https://www.cnblogs.com/it89/
  5 /// 創 建 者    :龍騰虎躍
  6 /// 創建日期    :2019/1/15 21:02:04 
  7 /// 功能描述    :
  8 /// 使用說明    :
  9 ///****************************************************************************
 10 using System;
 11 using System.ComponentModel;
 12 using System.Windows.Forms;
 13 
 14 namespace TestDataGridViewBind
 15 {
 16     public partial class Form1 : Form
 17     {
 18         private DataGridView mDataGridView;
 19         //private BindingSource mBindingSource; //綁定方式一需要的。
 20         private Button mAddItemBtn;
 21         private Button mChangeItemValueBtn;
 22         private Button mDeleteItemBtn;
 23 
 24         public BindingList<People> Peoples { get; set; }
 25 
 26         public Form1()
 27         {
 28             this.Load += this.Form1_Load;
 29             InitializeComponent();
 30         }
 31         public void Form1_Load(object sender, EventArgs e)
 32         {
 33             //初始化mDataGridView對象
 34             mDataGridView = new DataGridView();
 35             mDataGridView.AutoSize = true;
 36             mDataGridView.Left = 10;
 37             mDataGridView.Top = 40;
 38 
 39             //初始化mAddItemBtn按鈕。
 40             this.mAddItemBtn = new Button();
 41             mAddItemBtn.Text = "Add People";
 42             mAddItemBtn.AutoSize = true;
 43             mAddItemBtn.Left = 30;
 44             mAddItemBtn.Top = 10;
 45             mAddItemBtn.Click += this.mAddItemBtn_Click;
 46 
 47             //初始化mDeleteItemBtn按鈕
 48             mDeleteItemBtn = new Button();
 49             mDeleteItemBtn.Text = "Delete Item";
 50             mDeleteItemBtn.AutoSize = true;
 51             mDeleteItemBtn.Left = 120;
 52             mDeleteItemBtn.Top = 10;
 53             mDeleteItemBtn.Click += mDeleteItemBtn_Click;
 54 
 55             //初始化mChangeItemValueBtn按鈕。
 56             mChangeItemValueBtn = new Button();
 57             mChangeItemValueBtn.Text = "Change Item Value";
 58             mChangeItemValueBtn.AutoSize = true;
 59             mChangeItemValueBtn.Left = 220;
 60             mChangeItemValueBtn.Top = 10;
 61             mChangeItemValueBtn.Click += this.mChangeItemValueBtn_Click;
 62 
 63             //初始化Form1。
 64             this.Controls.Add(mDataGridView);
 65             this.Controls.Add(mAddItemBtn);
 66             this.Controls.Add(mDeleteItemBtn);
 67             this.Controls.Add(mChangeItemValueBtn);
 68             this.AutoSize = true;
 69             this.Text = "DataGridView object binding demo";
 70 
 71             //初始化Peoples對象。
 72             Peoples = new BindingList<People>();
 73             Peoples.Add(new People("張三", "北京", 25));
 74             Peoples.Add(new People("李四", "上海", 28));
 75             Peoples.Add(new People("王五", "深圳", 30));
 76 
 77             //綁定方式一:通過BindingSource對象把Peoples綁定到mDataGridView控制項。
 78             //mBindingSource = new BindingSource();
 79             //mBindingSource.DataSource = Peoples;
 80             //mDataGridView.DataSource = mBindingSource;
 81 
 82             //綁定方式二:直接通過mDataGridView.DataBindings綁定Peoples。Peoples不能引發改變通知事件,但是People類型繼承了INotifyPropertyChanged介面,可以引發改變通知事件。
 83             mDataGridView.DataBindings.Add("DataSource", this, "Peoples", false, DataSourceUpdateMode.OnPropertyChanged);
 84         }
 85 
 86         private void mAddItemBtn_Click(object sender, EventArgs e)
 87         {
 88             this.Peoples.Add(new People("新人", "湖南", 30));
 89         }
 90 
 91         private void mDeleteItemBtn_Click(object sender, EventArgs e)
 92         {
 93             if (this.Peoples.Count > 0)
 94             {
 95                 this.Peoples.RemoveAt(0);
 96             }
 97         }
 98 
 99         private void mChangeItemValueBtn_Click(object sender, EventArgs e)
100         {
101             if (Peoples.Count > 0)
102             {
103                 this.Peoples[0].Address = "浙江";
104                 //如果People沒有繼承INotifyPropertyChanged介面,則需要下麵註釋的代碼,來引發改變通知事件。
105                 //this.Peoples.ResetItem(0);//引發改變通知
106             }
107 
108             if (Peoples.Count > 1)
109             {
110                 this.Peoples[1].Age = Peoples[1].Age + 1;
111                 //this.Peoples.ResetItem(1);//引發改變通知
112             }
113         }
114     }
115 }
Form1.cs
 1 ///****************************************************************************
 2 /// CLR版本     :4.0.30319.42000
 3 /// 郵    箱    :[email protected]
 4 /// 博    客    :https://www.cnblogs.com/it89/
 5 /// 創 建 者    :龍騰虎躍
 6 /// 創建日期    :2019/1/15 21:03:04 
 7 /// 功能描述    :
 8 /// 使用說明    :
 9 ///****************************************************************************
10 using System;
11 using System.ComponentModel;
12 using System.Runtime.CompilerServices;
13 
14 namespace TestDataGridViewBind
15 {
16     /// <summary>
17     /// 
18     /// </summary>
19     public class People : INotifyPropertyChanged
20     {
21         #region "Public Section"
22         public string Name
23         {
24             get => mName;
25             set { mName = value; NotifyPropertyChanged("Name"); }
26         }
27 
28         public string Address
29         {
30             get => mAddresss;
31             set { mAddresss = value; NotifyPropertyChanged("Address"); }
32         }
33 
34         public int Age
35         {
36             get => mAge;
37             set { mAge = value; NotifyPropertyChanged("Age"); }
38         }
39 
40         public People(string name, string address, int age)
41         {
42             mName = name;
43             mAddresss = address;
44             mAge = age;
45         }
46 
47         public event PropertyChangedEventHandler PropertyChanged;
48 
49         #endregion
50 
51         #region "Private Section"
52         private string mName;
53         private string mAddresss;
54         private int mAge;
55 
56         /// <summary>
57         /// 該方法由每個屬性Set訪問器調用。
58         /// </summary>
59         /// <param name="propertyName"></param>
60         private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
61         {
62             PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
63         }
64 
65         #endregion
66     }
67 }
People.cs
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 反向代理是nginx的一個非常重要的功能。反向代理nginx支持四層反向代理和七層反向代理,如下圖。負載均衡負載均衡是實現服務高性能和高可用的重要手段,而nginx是實現負載均衡的重要工具。 ...
  • 目錄:https://www.cnblogs.com/liqingwen/p/10261436.html 可以創建泛型類,像這樣 這是一個泛型類,它使用類型 T 作為 Write 方法中的方法參數。可以按這種方式去使用: 即使類本身不是泛型,也可以創建泛型方法。 請註意, ThingWriter 類 ...
  • 目錄:https://www.cnblogs.com/liqingwen/p/10261436.html 通過重寫 Equals 方法可以改善結構體相等比較的性能方法。 如果結構體包含引用類型欄位(而不是僅僅只有值類型,如 int)。 預設情況下,結構體的相等性是通過對記憶體中的兩個結構體對象進行逐字 ...
  • 目錄:https://www.cnblogs.com/liqingwen/p/10261436.html 當需要一系列整型值時,可以使用某種迴圈手動創建,或者可以使用 Enumerable.Range 方法。以下為代碼說明: var oneToTen = Enumerable.Range(1, 10 ...
  • " 【.NET Core項目實戰 統一認證平臺】開篇及目錄索引 " 上一篇我介紹了 的生成驗證及流程內容,相信大家也對 非常熟悉了,今天將從一個小眾的需求出發,介紹如何強制令牌過期的思路和實現過程。 .netcore項目實戰交流群(637326624),有興趣的朋友可以在群里交流討論。 一、前言 眾 ...
  • 聲明:問題雖然已經被解決,但是並沒有明白具體原理,歡迎大佬補充。 最近網站出現一個問題,在C#裡面使用 HttpWebRequest 類去發送post請求,偶爾 會出現 “套接字(協議/網路地址/埠)只允許使用一次” 的異常,很明顯應該是埠被占用。 原因排查: 1、網上說最多就是其他程式占用埠 ...
  • 一.概述 在上二篇中,主要是介紹了asp.net core mvc中路由的使用,這篇繼續介紹路由在ASP.NET Core Razor中的使用。Razor Pages應該使用預設的傳統路由,從應用程式的Pages文件夾中提供命令資源。還可以使用其他約定來自定義 Razor Pages 路由行為。 在 ...
  • 一、背景 在實際項目的開發當中,使用 Abp Zero 自帶的審計日誌功能寫入效率比較低。其次審計日誌數據量中後期十分龐大,不適合與業務數據存放在一起。所以我們可以重新實現 Abp 的 介面,來讓我們的審計日誌數據存儲在 MongoDb 當中。 二、實現 2.0 引入相關包 這裡我們需要在模塊項目引 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...