亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C#開發(fā)WinForm之DataGridView開發(fā)詳解

 更新時間:2021年01月13日 14:19:10   作者:陳袁  
這篇文章主要介紹了C#開發(fā)WinForm之DataGridView開發(fā)詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前言

DataGridView是開發(fā)Winform的一個列表展示,類似于表格。學會下面的基本特征用法,再輔以經(jīng)驗,基本功能開發(fā)沒問題。

基本的數(shù)據(jù)渲染

根據(jù)提供的數(shù)據(jù)展示出效果。

提供給DataGridView數(shù)據(jù)源有很多方式,大致有如下三種:

直接增加,每個單元格類型都是DataGridViewTextBoxCell

int index=this.dataGridView1.Rows.Add();
this.dataGridView1.Rows[index].Cells[0].Value = "1";
this.dataGridView1.Rows[index].Cells[1].Value = "2";
this.dataGridView1.Rows[index].Cells[2].Value = "3";

直接增加一行,在行上的每天單元格內(nèi)添加數(shù)據(jù),缺點是太單一

直接增加,但我們可以指定單元格類型

DataGridViewRow row = new DataGridViewRow();
DataGridViewTextBoxCell textboxcell = new DataGridViewTextBoxCell();
textboxcell.Value = "aaa";
row.Cells.Add(textboxcell);
DataGridViewComboBoxCell comboxcell = new DataGridViewComboBoxCell();
row.Cells.Add(comboxcell);
dataGridView1.Rows.Add(row);

可選的類型如下圖:

在這里插入圖片描述

使用vo對象

上面2種都不是我想要的,因為列表展示的數(shù)據(jù)大部分情況下是復雜的后臺回傳的數(shù)據(jù)。所以我建議使用Vo。
新建InfoVo.cs類

public class InfoVo
 {
  /// <summary>
  /// 
  /// </summary>
  public string uidItem { get; set; }
  /// <summary>
  /// 
  /// </summary>
  public string uidItemRevision { get; set; }
  /// <summary>
  /// 
  /// </summary>
  public string primaryTag { get; set; }
 }

構造一個List,將InfoVo放進List對象里,然后將List對象賦值給dataGridView.DataSource即可。
在窗體的Load事件里添加如下代碼

private void SearchInfo_Load(object sender, EventArgs e)
  {
  	List<InfoVo> list = new List<InfoVo>();
    list.Add(new InfoVo(){ uidItem="1", uidItemRevision ="1", primaryTag ="1"});
    list.Add(new InfoVo(){ uidItem="2", uidItemRevision ="2", primaryTag ="2"});
    dataGridView.AutoGenerateColumns = false;
    dataGridView.DataSource = null;
    dataGridView.DataSource = list;
  }

直接賦值dataGridView.DataSource = list即可。這里的AutoGenerateColumns是禁止dataGridView自動根據(jù)vo屬性創(chuàng)建列。

在窗體上選中DataGridView,在屬性面板里點擊Columns選項。如下圖

在這里插入圖片描述

在打開的面板里,我們可以創(chuàng)建列。選擇是否可見,設置抬頭
DataPropertyName:指定列綁定的數(shù)據(jù)源屬性字段。
在DolumnType里我們可以指定單元格類型,如下圖

在這里插入圖片描述

比如下拉框,或者單元框。
至此,我們可以渲染出DataGridView組件里,下面看一些屬性。

dataGridView

列寬自適應

foreach (DataGridViewColumn column in dataGridView.Columns)
 {
  column.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
 }

成員名稱 說明
NotSet 列的大小調整行為從DataGridView.AutoSizeColumnsMode 屬性繼承。
None 列寬不會自動調整。
AllCells 調整列寬,以適合該列中的所有單元格的內(nèi)容,包括標題單元格。
AllCellsExceptHeader 調整列寬,以適合該列中的所有單元格的內(nèi)容,不包括標題單元格。
DisplayedCells 調整列寬,以適合當前屏幕上顯示的行的列中的所有單元格的內(nèi)容,包括標題單元格。
DisplayedCellsExceptHeader 調整列寬,以適合當前屏幕上顯示的行的列中的所有單元格的內(nèi)容,不包括標題單元格。
ColumnHeader 調整列寬,以適合列標題單元格的內(nèi)容。
Fill 調整列寬,使所有列的寬度正好填充控件的顯示區(qū)域,只需要水平滾動保證列寬在DataGridViewColumn.MinimumWidth屬性值以上。相對列寬由相對DataGridViewColumn.FillWeight屬性值決定。

如果想讓列寬能按比例填充顯示區(qū)域則 column.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;

禁止縮放單元格大小

2個屬性

  • AllowUserToResizeColumns:true:禁止縮放列
  • AllowUserToResizeRows:true:禁止縮放行

用戶自定義列的順序

用戶可以拖動的方式排序列展示
AllowUserToOrderColumns:true

是否可以編輯單元格

  • 窗體的ReadOnlyfalse
  • 在Columns彈出的列編輯窗口里,選擇列的ReadOnlyfalse
  • SelectionModeRowReadSelect(這是默認值)

行頭,列頭不顯示

在屬性面板里選中RowheadersVisible和ColumnHeadersVisible,置為false

列表顯示不完全,必需鼠標移到組件上才能顯示的bug

RowheadersVisible置為false即可。

行頭顯示行號

RowStateChanged事件添加監(jiān)聽,(在屬性面板右邊閃電圖標下找)。

private void dataGridView1_RowStateChanged(object sender, DataGridViewRowStateChangedEventArgs e)
{
 //顯示在HeaderCell上
 for (int i = 0; i < this.dataGridView1.Rows.Count; i++)
 {
  DataGridViewRow r = this.dataGridView1.Rows[i];
  r.HeaderCell.Value = string.Format("{0}", i + 1);
 }
 this.dataGridView1.Refresh();
}

行號沒有完全顯示出來的解決辦法是將DataGridViewRowHeadersWidthSizeMode屬性設置為AutoSizeToAllHeaders、AutoSizeToDisplayedHeaders或者AutoSizeToFirstHeader。

禁止自動創(chuàng)建列

如果我們提供的vo對象,dataGrid會自動根據(jù)屬性創(chuàng)建列,這不是我想要的,我希望能控制顯示。如下設置即可
dataGridView.AutoGenerateColumns = false;

修改單元格類型

單元格可以顯示文件,也可以顯示單元框,下拉框,圖片和超鏈拉。只要在編輯列窗口里選擇ColumnType下拉框,選擇一下即可。當然選擇的不同,數(shù)據(jù)設置不同,比如
單選框DataGridViewCheckBoxColumn如下

在這里插入圖片描述

下拉框DataGridViewComboBoxColumn

在這里插入圖片描述

選中模式

可以指定選中是整個行被選中還是每個小單元格被選中
SelectionMode,全部可選如下

在這里插入圖片描述

其它

當然還有其它,只要我們熟悉,在屬性面板上幾乎都能找到。

選中事件

CellClick是選中事件,不用它即可,不要用CellContentClick,因為如果單元格無內(nèi)容,這個CellContentClick事件不會觸發(fā)。

取得當前單元格內(nèi)容 :DataGridView1.CurrentCell.Value
取得當前單元格的列 Index:DataGridView1.CurrentCell.ColumnIndex
取得當前單元格的行 Index:DataGridView1.CurrentCell.RowIndex
取得當前行:dataGridView.CurrentRow;
獲得綁定的vo

DataGridViewRow dataGridViewRow = dataGridView.CurrentRow;
   InfoVo infoVo = dataGridViewRow.DataBoundItem as InfoVo ;
   infoVo .uidItemRevision ;

如果表格可編輯,那么編輯完表格會同步更新DataBoundItem綁定的vo對象

遍歷列表里所有單元格

	foreach (DataGridViewRow item in dataGridView.Rows)
   {
     //item是每行的對象,cells是單元格集合
    if (null != item.Cells[0].Value && (Boolean)item.Cells[0].Value)
    {
			item.Cells[0].Value.toString();
		}
	}

使用 DataGridView.CurrentCellAddress 屬性(而不是直接訪問單元格)來確定單元格所在的
行: DataGridView.CurrentCellAddress.Y
列: DataGridView.CurrentCellAddress.X 。

當前的單元格可以通過設定 DataGridView 對象的 CurrentCell 來改變??梢酝ㄟ^ CurrentCell 來設定
DataGridView 的激活單元格。將 CurrentCell 設為 Nothing(null) 可以取消激活的單元格。

DataGridView DataGridViewCheckBoxColumn編輯時實時觸發(fā)事件

正常響應CellValueChanged()事件時,當改變checkbox狀態(tài)時,只有當焦點離開該單元格時才能觸發(fā)CellValueChanged()事件,

如果要改變checkbox值時實時觸發(fā)CellValueChanged()事件,需要借用CurrentCellDirtyStateChanged()事件來提交未提交控件的更改。

private void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e)
  {
   if (dataGridView1.IsCurrentCellDirty)
   {
    dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
   }
  }

事實上,當調用dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);時,就提交了當前的修改,很多其它事件都會有響應,其中CellValueChanged就是其中之一。
這樣CellValueChanged()事件就可以隨著checkbox的值的改變實時觸發(fā)。
以全選/反選為例說明當DataGridViewCheckBoxColumn發(fā)生變化時怎么處理全選/反選。
CheckBox有3種狀態(tài):選中(CheckState.Checked)/取消(CheckState.Unchecked)/部分選中(CheckState.Indeterminate)
在winForm組件里拖拽一個CheckBox命名為selectAllCheckBox,Text為全選,拖拽一個LinkLabel命名為revSelectLinkLbl,Text為反選。

 //全選
  private void selectAllCheckBox_CheckedChanged(object sender, EventArgs e)
  {
   CheckBox c = sender as CheckBox;
   if(c.CheckState == CheckState.Checked)
   {
    ChangeDataSourceChecked(true);
   }
   else if(c.CheckState == CheckState.Unchecked)
   {
    ChangeDataSourceChecked(false);
   }
  }

  private void ChangeDataSourceChecked(Boolean isSelected)
  {
   foreach (SavePlmBomResponseVo savePlmBomResponseVo in dataSource)
   {
    savePlmBomResponseVo.checkedC = isSelected;
   }
   dataGridView.DataSource = null;
   dataGridView.DataSource = dataSource;
  }
  /// <summary>
  /// 反選
  /// </summary>
  /// <param name="sender"></param>
  /// <param name="e"></param>
  private void revSelectLinkLbl_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
  {
   if (this.selectAllCheckBox.CheckState == CheckState.Checked)
   {
    this.selectAllCheckBox.CheckState = CheckState.Unchecked;
   }
   else if(this.selectAllCheckBox.CheckState == CheckState.Unchecked)
   {
    this.selectAllCheckBox.CheckState = CheckState.Checked;
   }
   else
   {
    //部分選中
    foreach (SavePlmBomResponseVo savePlmBomResponseVo in dataSource)
    {
     if (savePlmBomResponseVo.checkedC)
     {
      savePlmBomResponseVo.checkedC = false;
     }
     else
     {
      savePlmBomResponseVo.checkedC = true;
     }
    }
    dataGridView.DataSource = null;
    dataGridView.DataSource = dataSource;
   }
  }

  /// <summary>
  /// 處理DataSource數(shù)據(jù)變化時,全選/反選選中狀態(tài)
  /// </summary>
  private void calSelectAllCheckBoxState()
  {
   int selectedCount = 0;
   foreach (SavePlmBomResponseVo savePlmBomResponseVo in dataSource)
   {
    if (savePlmBomResponseVo.checkedC)
    {
     ++selectedCount;
    }
   }
   if (selectedCount == 0)
   {
    if(this.selectAllCheckBox.CheckState != CheckState.Unchecked)
    {
     this.selectAllCheckBox.CheckState = CheckState.Unchecked;
    }
   }
   else if (selectedCount == dataSource.Count)
   {
    if (this.selectAllCheckBox.CheckState != CheckState.Checked)
    {
     this.selectAllCheckBox.CheckState = CheckState.Checked;
    }
   }
   else
   {
    if (this.selectAllCheckBox.CheckState != CheckState.Indeterminate)
    {
     this.selectAllCheckBox.CheckState = CheckState.Indeterminate;
    }
   }
  }

  /// <summary>
  /// 提交修改狀態(tài)
  /// </summary>
  /// <param name="sender"></param>
  /// <param name="e"></param>
  private void DataGridView_CurrentCellDirtyStateChanged(object sender, EventArgs e)
  {
   if (this.dataGridView.IsCurrentCellDirty)
   {
    this.dataGridView.CommitEdit(DataGridViewDataErrorContexts.Commit);
   }
  }

  //行值變化
  private void DataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e)
  {
   calSelectAllCheckBoxState();
  }

到此這篇關于C#開發(fā)WinForm之DataGridView開發(fā)詳解的文章就介紹到這了,更多相關C# DataGridView開發(fā)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C#結合Minio實現(xiàn)文件上傳存儲與更新

    C#結合Minio實現(xiàn)文件上傳存儲與更新

    MinIO是一個開源的對象存儲服務器,專門設計用于在大規(guī)模數(shù)據(jù)存儲環(huán)境中運行,這篇文章主要為大家介紹了C#如何結合Minio實現(xiàn)文件上傳存儲與更新,需要的可以參考下
    2024-03-03
  • Unity 按鈕添加OnClick事件操作

    Unity 按鈕添加OnClick事件操作

    這篇文章主要介紹了Unity 按鈕添加OnClick事件操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • C# 計算傳入的時間距離今天的時間差

    C# 計算傳入的時間距離今天的時間差

    本文通過一段簡單的代碼給大家介紹了C# 計算傳入的時間距離今天的時間差,代碼簡單易懂,需要的朋友參考下吧
    2017-08-08
  • Windows系統(tǒng)中使用C#編寫藍牙通信程序的簡單實例

    Windows系統(tǒng)中使用C#編寫藍牙通信程序的簡單實例

    這篇文章主要介紹了Windows系統(tǒng)中使用C#編寫藍牙通信程序的簡單實例,文中的例子使用到了32feet.NET中的InTheHand.Net.Personal類庫,需要的朋友可以參考下
    2016-04-04
  • WinForm項目開發(fā)中Excel用法實例解析

    WinForm項目開發(fā)中Excel用法實例解析

    這篇文章主要介紹了WinForm項目開發(fā)中Excel用法,非常實用,需要的朋友可以參考下
    2014-08-08
  • C#中設計、使用Fluent API

    C#中設計、使用Fluent API

    這篇文章主要介紹了C#中設計、使用Fluent API,本文講解了最簡單且最實用的設計、設計具有調用順序的Fluent API、泛型類的Fluent設計等內(nèi)容,需要的朋友可以參考下
    2015-03-03
  • C#實現(xiàn)的XML操作類實例

    C#實現(xiàn)的XML操作類實例

    這篇文章主要介紹了C#實現(xiàn)的XML操作類,涉及C#操作XML文件的讀取、插入、修改、刪除等操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-08-08
  • C#對Xamarin框架進行數(shù)據(jù)綁定

    C#對Xamarin框架進行數(shù)據(jù)綁定

    這篇文章介紹了C#對Xamarin框架進行數(shù)據(jù)綁定,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-01-01
  • 舊項目升級新版Unity2021導致Visual?Studio無法使用的問題

    舊項目升級新版Unity2021導致Visual?Studio無法使用的問題

    在項目開發(fā)過程中,不可避免的會升級開發(fā)工具。這次我在舊項目版本升級到新版Unity2021.2.x時,出現(xiàn)Visual?Studio無法定位等問題,這里我給大家分享下解決方法,舊項目升級新版Unity2021導致Visual?Studio無法使用的問題,需要的朋友可以參考下
    2021-12-12
  • C#實現(xiàn)猜數(shù)字小游戲

    C#實現(xiàn)猜數(shù)字小游戲

    這篇文章主要為大家詳細介紹了C#實現(xiàn)猜數(shù)字小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03

最新評論