引言
??DataGridView我把他叫做網(wǎng)格數(shù)據(jù)控件 。我們?cè)陲@示表格數(shù)據(jù)的時(shí)候,經(jīng)常會(huì)用想到用它, 他就像Excel表格一樣。我們知道只要是數(shù)據(jù)表,就一定逃不掉表的增刪查改操作。
??該篇,我在VS2019的環(huán)境下通過(guò)demo實(shí)例來(lái)實(shí)現(xiàn)DataGridView控件的一系列功能,包括添加一行數(shù)據(jù)、切換允許修改單元格、復(fù)制選擇數(shù)據(jù)、復(fù)制所有數(shù)據(jù)、讀一行數(shù)據(jù)、讀取所有數(shù)據(jù)、查找記錄、刪除一行數(shù)據(jù)、刪除一行數(shù)據(jù)、刪除多行數(shù)據(jù)、清除所有行以及清除所有列。
一、界面簡(jiǎn)介
??我新建了一個(gè)Form窗體。左上角最大的控件就是DataGridView,將demo功能定義到按鍵的單擊事件中,另外添加了 一個(gè)文本框textBox和兩個(gè)下拉菜單comBox來(lái)輸入姓名、性別和班級(jí)。富文本框用來(lái)輸出部分功能的輸出使用。請(qǐng)見(jiàn)下圖。
二、初始化
??初始化包括參數(shù)初始化和表頭初始化。
??(1)參數(shù)初始化可以使用代碼修改,也可以通過(guò)屬性欄修改默認(rèn)值,屬性比較多,可以自己去嘗試,下面我只舉幾個(gè)用代碼控制的例子。
??(2)表頭初始化的目的是添加列,沒(méi)有列是無(wú)法添加對(duì)應(yīng)的行數(shù)據(jù)的,我們可以不用規(guī)定列的寬度和表頭內(nèi)容,但是必須定義列數(shù)量,dataGridView.Columns.Add(new DataGridViewTextBoxColumn())就只實(shí)現(xiàn)這個(gè)功能的。如實(shí)例中,我們就添加了4個(gè)列。
private void InitDataGridView ()
{
//根據(jù)Header和所有單元格的內(nèi)容自動(dòng)調(diào)整行的高度
dataGridView.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
//設(shè)置內(nèi)容對(duì)齊方式和字體
dataGridView.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
//dataGridView_Report.Font = new Font("宋體", 10);
//設(shè)置所有單元格都不可編輯
dataGridView.ReadOnly = true;
//設(shè)置標(biāo)題頭列寬
dataGridView.RowHeadersWidth = 15;
//不可以增加空行
dataGridView.AllowUserToAddRows = false;
//添加表頭
for (int i = 0; i < 4; i++)
{
dataGridView.Columns.Add(new DataGridViewTextBoxColumn());
}
//指定標(biāo)題列寬
dataGridView.Columns[0].Width = 60;
dataGridView.Columns[1].Width = 100;
dataGridView.Columns[2].Width = 80;
dataGridView.Columns[3].Width = 150;
//添加標(biāo)題字符
dataGridView.Columns[0].HeaderText = "序號(hào)";
dataGridView.Columns[1].HeaderText = "姓名";
dataGridView.Columns[2].HeaderText = "性別";
dataGridView.Columns[3].HeaderText = "班級(jí)";
}
三、添加一行數(shù)據(jù)
??添加一行數(shù)據(jù),首先,要明確你要在表格的哪個(gè)位置添加幾行數(shù)據(jù),否則,無(wú)法知道往什么位置insert多少個(gè)數(shù)據(jù)。其次,必須清楚每一列的數(shù)據(jù)類型,一一對(duì)應(yīng)才可以寫(xiě)對(duì)數(shù)據(jù)。另外,ClearSelection()方法可以去除默認(rèn)的選擇,防止始終有選擇的焦點(diǎn)在控件上,可以讓界面清靜一點(diǎn)。
private void button_add_Click(object sender, EventArgs e)
{
//排除異常輸入
if(textBox_Name.Text == string.Empty || comboBox_Sex.Text ==string.Empty|| comboBox_Class.Text == string.Empty)
{
return;
}
//得到總行數(shù)
int num = dataGridView.Rows.Count;
//向第一行插入一行數(shù)據(jù)
this.dataGridView.Rows.Insert(0, 1);
//寫(xiě)第一行第二列數(shù)據(jù)//插入名字
this.dataGridView.Rows[0].Cells[1].Value = textBox_Name.Text;
//寫(xiě)第一行第三列數(shù)據(jù)//插入性別
this.dataGridView.Rows[0].Cells[2].Value = comboBox_Sex.Text;
//寫(xiě)第一行第四列數(shù)據(jù)//插入班級(jí)
this.dataGridView.Rows[0].Cells[3].Value = comboBox_Class.Text;
//寫(xiě)第所有行第一列數(shù)據(jù)//插入顯示序號(hào)
for (int i = 0; i < num + 1; i++)
{
this.dataGridView.Rows[i].Cells[0].Value = i + 1;
}
//去除選擇
dataGridView.ClearSelection();
}
四、允許修改表格
??允許修改表格是由屬性ReadOnly決定的。因此,非常容易改變和修改。實(shí)例中用CheckBox的改變事件來(lái)控制屬性的true 或false。
private void checkBox_Modify_CheckedChanged(object sender, EventArgs e)
{
if(checkBox_Modify.Checked == true)
dataGridView.ReadOnly = false;
else
dataGridView.ReadOnly = true;
}
五、復(fù)制選擇的數(shù)據(jù)
??DataGridView控件是可以允許選擇一個(gè)單元格或者多個(gè)單元格,跨行的單元格,我們通過(guò)
選擇后,背景色將變成默認(rèn)的藍(lán)色。我們注意要先排除沒(méi)有被選擇的情況。這里的Clipboard.SetDataObject()方法,和Ctrl+C的功能是一樣的。我們就可以利用這個(gè)省去用戶鍵盤(pán)操作。
private void button_Copy_Click(object sender, EventArgs e)
{
//排除異常
if (dataGridView.CurrentCell == null)
return;
//單元格格式化內(nèi)容復(fù)制到粘貼板
Clipboard.SetDataObject(dataGridView.GetClipboardContent());
}
六、復(fù)制所有數(shù)據(jù)
??復(fù)制所有數(shù)據(jù)和復(fù)制指定數(shù)據(jù)一樣,只是我們可以將控件的所有數(shù)據(jù)自動(dòng)全選上。再直接拷貝到粘貼板。簡(jiǎn)直不要太簡(jiǎn)單。
private void button_SelectAll_Click(object sender, EventArgs e)
{
dataGridView.SelectAll();
//單元格格式化內(nèi)容復(fù)制到粘貼板
Clipboard.SetDataObject(dataGridView.GetClipboardContent());
}
七、讀一行數(shù)據(jù)
??讀一行數(shù)據(jù),前提條件是需要首先選擇好一行數(shù)據(jù)的,點(diǎn)擊每行的最左邊就可以選擇整行數(shù)據(jù)的,否者我們就不執(zhí)行后面的操作。
??獲取選擇的索引后將數(shù)據(jù)按照整列的數(shù)據(jù)逐一拷貝到數(shù)組中,最后顯示。當(dāng)然也可以不使用逐一讀取,通過(guò)數(shù)據(jù)復(fù)制的方法將數(shù)據(jù)格式化數(shù)據(jù)送到粘貼板后再進(jìn)行操作。
??如果選擇了多行,甚至是跨行多行,索引Index則是指向最后一個(gè)行,所以,代碼將復(fù)制最后的那一行。
private void button_Read_Click(object sender, EventArgs e)
{
//判斷是否選中一行
if (dataGridView.SelectedRows.Count == 0)
return;
//獲取選擇的索引
int index = dataGridView.CurrentRow.Index;
string line = "";
for (int i = 1; i < dataGridView.ColumnCount; i++)
{
line += dataGridView.Rows[index].Cells[i].Value.ToString();
if (i == dataGridView.ColumnCount - 1)
line += "\n";
}
//顯示在富文本中
display_in_richTextBox(line);
}
八、讀所有數(shù)據(jù)
??讀取所有數(shù)據(jù)和復(fù)制所有數(shù)據(jù)有點(diǎn)類似,這里直接使用兩個(gè)for循環(huán)將每個(gè)單元格的數(shù)據(jù)格式化輸出連接到字符串中。
private void button_ReadAll_Click(object sender, EventArgs e)
{
string all_data = "";
for(int i = 0; i < dataGridView.Rows.Count; i++)//行循環(huán)
{
for (int j = 0; j < dataGridView.ColumnCount; j++) //列循環(huán)
{
all_data += dataGridView.Rows[i].Cells[j].Value.ToString();
if (j == dataGridView.ColumnCount - 1)
all_data += "\n";
else
all_data += "\t";
}
}
//顯示數(shù)據(jù)
display_in_richTextBox(all_data);
}
九、查找名字記錄
??查找某個(gè)列的記錄中是否有對(duì)應(yīng)的數(shù)據(jù)存在,這里我按照順序的方法直接找到對(duì)應(yīng)數(shù)據(jù),并將焦點(diǎn)跳到搜索到的位置。查找的算法方法很多,還可以多次查找,模糊查找、這里只是為了說(shuō)明控件實(shí)現(xiàn),就不使用其它方法來(lái)復(fù)雜代碼了。
//位置定義
int position = 0;
private void button_Search_Click(object sender, EventArgs e)
{
//獲取行數(shù)
int Count = dataGridView.Rows.Count;
//得到的要搜索的內(nèi)容
string find_name = textBox_Name.Text;
//循環(huán)搜讀對(duì)比
for (int i = position; i < Count; i++)
{
if (find_name == dataGridView.Rows[i].Cells[1].Value.ToString())//對(duì)比
{
//選擇指定單元格
dataGridView.CurrentCell = dataGridView.Rows[i].Cells[1];
//返回
return;
}
}
//沒(méi)有找到
}
十、刪除一行數(shù)據(jù)
??刪除一行數(shù)據(jù)同樣是需要先規(guī)定是選中了至少有1行以上,刪除行才有意義。
??如果選擇了多行,甚至是跨行多行,索引Index則是指向最后一個(gè)行,因此這種情況,代碼將刪除最后的那一行。
private void button_Delete_Click(object sender, EventArgs e)
{
//判斷是否選中一行
if (dataGridView.SelectedRows.Count == 0)
return;
//刪除一行
dataGridView.Rows.RemoveAt(dataGridView.CurrentRow.Index);
}
十一、刪除多行數(shù)據(jù)
?? SelectedRows是獲取用戶選定的行的集合。通過(guò)選擇集合的循環(huán),可以逐個(gè)刪除(remove)掉對(duì)應(yīng)的所有行(row)。感覺(jué)這個(gè)方法還是非??旖莸摹?/p>
private void button_DeleteMultRow_Click(object sender, EventArgs e)
{
foreach (DataGridViewRow row in dataGridView.SelectedRows)
{
if (!row.IsNewRow)
{
dataGridView.Rows.Remove(row);
}
}
}
十二、清除所有行
?? 清除所有行的方法 Rows.Clear()是我們需要清除所有數(shù)據(jù)時(shí)使用的,清除后表頭是不會(huì)刪除的。
private void button_Clear_Click(object sender, EventArgs e)
{
//刪除所有行
dataGridView.Rows.Clear();
}
十三、刪除所有列
?? 清除所有列的方法Columns.Clear() 是我們需要清除所有數(shù)據(jù)和表頭時(shí)使用的,清除后表頭會(huì)刪除掉的,也就是沒(méi)有了列,要重新添加數(shù)據(jù)時(shí)需要初始化列才可以的。
private void button_ClearColumns_Click(object sender, EventArgs e)
{
//刪除包括標(biāo)題在內(nèi)的所有列
dataGridView.Columns.Clear();
}
十四、其它:選中單元格
?? 下面實(shí)例實(shí)現(xiàn)的是指定選中第0行第1列。此單元格將高亮。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-406983.html
dataGridView.CurrentCell = dataGridView.Rows[0].Cells[1];
十五、最后
?? 上面講到的是我平時(shí)有用到的DataGridView控件的方法,抽空用demo工程實(shí)現(xiàn)和描述了一遍,時(shí)間有限,如有描述的不夠明白的,朋友們都可以與我討論和指正。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-406983.html
到了這里,關(guān)于C# DataGridView控件的基礎(chǔ)應(yīng)用實(shí)例的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!