關於 winform GridView 的操作

来源:https://www.cnblogs.com/liuchenxing/archive/2022/04/21/16173084.html
-Advertisement-
Play Games

在用 winform 的時候,我們操作表格數據一般使用 GridView 會比較多,這裡我總結下我在使用的過程中遇到的一些問題 一、首先創建窗體和表格,將表格簡單設置一下,去除最後一行編輯行,去除預設的第一列空白列,將背景設置為白色 AllowUserToAddRows 去除最後一行編輯行 RowH ...


    在用 winform 的時候,我們操作表格數據一般使用 GridView 會比較多,這裡我總結下我在使用的過程中遇到的一些問題

    一、首先創建窗體和表格,將表格簡單設置一下,去除最後一行編輯行,去除預設的第一列空白列,將背景設置為白色

      AllowUserToAddRows  去除最後一行編輯行

      RowHeadersVisible 去除預設的第一列空白列

      BackgroudColor 將表格背景設為其他顏色

     

    二、讀取數據很簡單 DataSource 可以接受 DataTable 或者 List 等數據格式

      一般我們每行數據後面會有一個操作列,那麼在使用操作列時,這裡提供兩種方法,一種使用代碼添加,一種使用表格屬性添加

      第一種,表格屬性添加,保存後,就會出現一個操作列,按鈕的顯示文本一定要在 DefaultCellStyle 中設置,然後打開 GridView 的屬性,添加 CellContentClick 事件,給按鈕一個事件

 1 private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
 2         {
 3             if (this.dataGridView1.Columns[e.ColumnIndex].Name == "Column10")
 4             {
 5                 //獲取當前數據 ID
 6                 int id = Convert.ToInt32(this.dataGridView1.Rows[e.RowIndex].Cells[1].Value);
 7 
 8                 MessageBox.Show($"當前數據ID:{id}");
 9             }
10         }

      第二種,使用代碼添加按鈕,添加完成後,同樣也要給一個事件,事件的方法同第一種一樣,這裡就不重覆貼代碼了

 1 dataGridView2.DataSource = dt;
 2 
 3                 //創建按鈕
 4                 DataGridViewButtonColumn btnOpenFile = new DataGridViewButtonColumn();
 5                 btnOpenFile.Name = "SelectDetail";
 6                 btnOpenFile.HeaderText = "查看詳情";
 7                 btnOpenFile.DefaultCellStyle.NullValue = "查看詳情";
 8                 dataGridView2.Columns.Add(btnOpenFile);
 9 
10                 //載入按鈕點擊事件
11                 dataGridView2.CellContentClick += DataGridView2_CellContentClick;

       那麼我們開始為什麼加一個 tabControl 的控制項呢?這裡是為了演示一個問題,我們在切換兩個 tab 的時候,實際上時每次都去讀取數據並顯示,那麼就會出現一個問題,使用代碼添加的按鈕,會重覆出現多次按鈕,因為每次載入時都會創建按鈕(有可能有解決方案,但是我這裡沒查到,歡迎評論留言解決方案)。而使用表格屬性添加的按鈕則不會。

             

      我們這裡在加個常用功能,增加 CheckBox 選擇數據並刪除

      這裡只需要增加一個 CheckBox 類型的列就行了

         

      選擇數據後點擊刪除按鈕

private void button1_Click(object sender, EventArgs e)
        {
            int count = 0;

            //獲取選擇數據的條數
            for (int i = 0; i < this.dataGridView1.RowCount; i++)
            {
                if (this.dataGridView1.Rows[i].Cells[0].EditedFormattedValue.ToString() == "TRUE") { count++; }
            }

            if (count == 0) { MessageBox.Show("請選擇數據"); return; }
            else
            {
                //定義泛型list
                IList list = null;
                List<FileData> list1 = new List<FileData>();
                for (int i = 0; i < this.dataGridView1.RowCount; i++)
                {
                    if (this.dataGridView1.Rows[i].Cells[0].EditedFormattedValue.ToString() == "TRUE")
                    {
                        //賦值給泛型list
                        list = (IList)this.dataGridView1.DataSource;

                        //將數據從泛型list刪除
                        list.RemoveAt(this.dataGridView1.CurrentRow.Index);
                    }
                }

                //遍歷泛型Gridview數據
                foreach (var item in list)
     {
//var obj = new { ClientId = 7, ClientName = "ACME Inc.", Jobs = 5 };
                    System.Type types = item.GetType();
                    string path = (string)types.GetProperty("Path").GetValue(item, null);
                    double size = (double)types.GetProperty("Size").GetValue(item, null);
                    string type = (string)types.GetProperty("Type").GetValue(item, null);
                    string name = (string)types.GetProperty("Name").GetValue(item, null);

                    //添加至新的list里
                    list1.Add(new FileData() { Size = size, Path = path, Type = type, Name = name });
                }

                //將新的list內容賦值給舊的對象
                listFile = list1;

                //this.dataGridView1.DataSource = null;

                //重新給gridview賦值,不可清空gridview在賦值,會出現格式數據被清除
                this.dataGridView1.DataSource = listFile.Select(group => new
                {
                    Size = group.Size,
                    Path = group.Path,
                    Type = group.Type,
                    Name = group.Name
                }).ToList();
            }
        }

      我這裡的做法是,將 DataSource 直接賦值給一個泛型的List對象,然後通過這個泛型List刪除 數據,最後將泛型List轉為對應的顯示數據對象,如果不轉成對應的對象,就會出現列頭的直接顯示為你的資料庫表欄位名

      下麵是全選,反選的方法

/// <summary>
        /// 全選
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button5_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < this.dataGridView1.Rows.Count; i++)
            {
                this.dataGridView1.Rows[i].Cells[0].Value = "TRUE";
            }
        }

        /// <summary>
        /// 反選
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button6_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < this.dataGridView1.Rows.Count; i++)
            {
                if (Convert.ToString(this.dataGridView1.Rows[i].Cells[0].Value) == "TRUE")
                    this.dataGridView1.Rows[i].Cells[0].Value = "FALSE";
                else
                    this.dataGridView1.Rows[i].Cells[0].Value = "TRUE";
            }
        }

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 來啦,老弟 python 我們已經知道怎麼使用 Requests 進行各種請求騷操作 也知道了對伺服器返回的數據如何使用 正則表達式 來過濾我們想要的內容 … 那麼接下來 Python學習交流Q群:906715085### 我們就使用 requests 和 re 來寫一個爬蟲 作為一個愛看書的你(說 ...
  • 公用包 將常用功能,業務,核心代碼封裝成一個獨立的包,然後部署到私服上,讓其它開發人員去使用,很好的進行了版本的控制,代碼也更安全,在maven中部署時,使用plugin將資源文件帶上。 <build> <plugins> <!-- 發佈源碼,需要這個插件 --> <plugin> <groupId ...
  • 之前曾在《C# 中容易忽視的 Encoding.GetByteCount 記憶體問題》中提到過,可以使用 Encoding.Default.GetByteCount 方法來判斷字元是全寬(寬度為 2)還是半寬(寬度為 1)。 這個方法實際上是計算對字元編碼後產生的位元組數,只是在中文環境下,寬字元在使用 ...
  • 在樹莓派上部署ASP.NET環境(樹莓派做ASP.NET項目伺服器),之後Windows上開發的ASP.NET項目可以部署在樹莓派上。 ...
  • 最近想深入學習ES,想在它的基礎上定製日誌收集中間件,所以特定把它記錄下來 創建ES配置文件 elasticsearch.yml,把文件放到 config目錄下 # 集群名稱 cluster.name: kite-es-cluster # 節點名稱 node.name: kite-es-node-1 ...
  • 使用背景: 關於滑動驗證碼的使用場所還是非常多的,如: 調取簡訊介面之前,和 註冊請求之前 或者 頻繁會調用的介面 都需要加這個拼圖驗證。這裡先上一下效果圖吧(心中無碼,自然高清)。 話不多說,開擼! 實現分析: 滑動驗證碼的邏輯也很簡單。大概說一下: 1,伺服器生成主圖+附圖(從主圖裁剪下來的不需 ...
  • 前言 C# 11 中即將到來一個可以讓重視性能的開發者狂喜的重量級特性,這個特性主要是圍繞著一個重要底層性能設施 ref 和 struct 的一系列改進。 但是這部分的改進涉及的內容較多,不一定能在 .NET 7(C# 11)做完,因此部分內容推遲到 C# 12 也是有可能的。當然,還是很有希望能在 ...
  • 1.授權與認證的作用 1.1.資源保護 網路資源保護機制是一個鮮為人知的基本措施,比如我們會對網路相冊設置密碼並指定部分用戶才可訪問,又比如我們網盤的資源分享時設置的訪問密碼等等措施。這種資源保護的機制不光體現於此,作為軟體從業人員對於我們開發的API的訪問也是有一套保護機制的,那麼對應到API的保 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...