DataGridViewinWindowsForms–Tips,TricksandFrequentlyAskedQuestions(FAQ)
2,470 views
0
DataGridView control is a Windows Forms control that gives you the ability to customize and edit tabular data. It gives you number of properties, methods and events to customize its appearance and behavior. In this article, we will discuss some frequently asked questions and their solutions. These questions have been collected from a variety of sources including some newsgroups, MSDN site and a few, answered by me at the MSDN forums.
Tip 1 – Populating a DataGridView
In this short snippet, we will populate a DataGridView using the LoadData() method. This method uses the SqlDataAdapter to populate a DataSet. The table ‘Orders’ in the DataSet is then bound to the BindingSource component which gives us the flexibility to choose/modify the data location.
C#
public
partial
class
Form1
:
Form
{
private
SqlDataAdapter
da;
private
SqlConnection
conn;
BindingSource
bsource =
new
BindingSource
();
DataSet
ds =
null
;
string
sql;
public
Form1()
{
InitializeComponent();
}
private
void
btnLoad_Click(
object
sender,
EventArgs
e)
{
LoadData();
}
private
void
LoadData()
{
string
connectionString =
"Data Source=localhost;Initial Catalog=Northwind;"
+
"Integrated Security=SSPI;"
;
conn =
new
SqlConnection
(connectionString);
sql =
"SELECT OrderID, CustomerID, EmployeeID, OrderDate, Freight,"
+
"ShipName, ShipCountry FROM Orders"
;
da =
new
SqlDataAdapter
(sql, conn);
conn.Open();
ds =
new
DataSet
();
SqlCommandBuilder
commandBuilder =
new
SqlCommandBuilder
(da);
da.Fill(ds,
"Orders"
);
bsource.DataSource = ds.Tables[
"Orders"
];
dgv.DataSource = bsource;
}
}
VB.NET
Public
Partial
Class
Form1
Inherits
Form
Private
da
As
SqlDataAdapter
Private
conn
As
SqlConnection
Private
bsource
As
BindingSource =
New
BindingSource()
Private
ds
As
DataSet =
Nothing
Private
sql
As
String
Public
Sub
New
()
InitializeComponent()
End
Sub
Private
Sub
btnLoad_Click(
ByVal
sender
As
Object
,
ByVal
e
As
EventArgs)
LoadData()
End
Sub
Private
Sub
LoadData()
Dim
connectionString
As
String
= "Data Source=localhost;Initial Catalog=Northwind;" & "Integrated Security=SSPI;"
conn =
New
SqlConnection(connectionString)
sql = "SELECT OrderID, CustomerID, EmployeeID, OrderDate, Freight," & "ShipName, ShipCountry FROM Orders"
da =
New
SqlDataAdapter(sql, conn)
conn.Open()
ds =
New
DataSet()
Dim
commandBuilder
As
SqlCommandBuilder =
New
SqlCommandBuilder(da)
da.Fill(ds, "Orders")
bsource.DataSource = ds.Tables("Orders")
dgv.DataSource = bsource
End
Sub
End
Class
Tip 2 – Update the data in the DataGridView and save changes in the database
After editing the data in the cells, if you would like to update the changes permanently in the database, use the following code:
C#
private
void
btnUpdate_Click(
object
sender,
EventArgs
e)
{
DataTable
dt = ds.Tables[
"Orders"
];
this
.dgv.BindingContext[dt].EndCurrentEdit();
this
.da.Update(dt);
}
VB.NET
Private
Sub
btnUpdate_Click(
ByVal
sender
As
Object
,
ByVal
e
As
EventArgs)
Dim
dt
As
DataTable = ds.Tables("Orders")
Me
.dgv.BindingContext(dt).EndCurrentEdit()
Me
.da.Update(dt)
End
Sub
Tip 3 – Display a confirmation box before deleting a row in the DataGridView
Handle the UserDeletingRow event to display a confirmation box to the user. If the user confirms the deletion, delete the row. If the user clicks cancel, set e.cancel = true which cancels the row deletion.
C#
private
void
dgv_UserDeletingRow(
object
sender,
DataGridViewRowCancelEventArgs
e)
{
if
(!e.Row.IsNewRow)
{
DialogResult
res =
MessageBox
.Show(
"Are you sure you want to delete this row?"
,
"Delete confirmation"
,
MessageBoxButtons
.YesNo,
MessageBoxIcon
.Question);
if
(res ==
DialogResult
.No)
e.Cancel =
true
;
}
}
VB.NET
Private
Sub
dgv_UserDeletingRow(
ByVal
sender
As
Object
,
ByVal
e
As
DataGridViewRowCancelEventArgs)
If
(
Not
e.Row.IsNewRow)
Then
Dim
res
As
DialogResult = MessageBox.Show("Are you sure you want to delete this row?", "Delete confirmation", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
If
res = DialogResult.No
Then
e.Cancel =
True
End
If
End
If
End
Sub
Tip 4 – How to autoresize column width in the DataGridView
The snippet shown below, first auto-resizes the columns to fit its content. Then the AutoSizeColumnsMode is set to the ‘DataGridViewAutoSizeColumnsMode.AllCells’ enumeration value which automatically adjust the widths of the columns when the data changes.
C#
private
void
btnResize_Click(
object
sender,
EventArgs
e)
{
dgv.AutoResizeColumns();
dgv.AutoSizeColumnsMode =
DataGridViewAutoSizeColumnsMode
.AllCells;
}
VB.NET
Private
Sub
btnResize_Click(
ByVal
sender
As
Object
,
ByVal
e
As
EventArgs)
dgv.AutoResizeColumns()
dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells
End
Sub
Tip 5 - Select and Highlight an entire row in DataGridView
C#
int
rowToBeSelected = 3;
// third row
if
(dgv.Rows.Count >= rowToBeSelected)
{
// Since index is zero based, you have to subtract 1
dgv.Rows[rowToBeSelected - 1].Selected =
true
;
}
VB.NET
Dim
rowToBeSelected
As
Integer
= 3
' third row
If
dgv.Rows.Count >= rowToBeSelected
Then
' Since index is zero based, you have to subtract 1
dgv.Rows(rowToBeSelected - 1).Selected =
True
End
If
Tip 6 - How to scroll programmatically to a row in the DataGridView
The DataGridView has a property called FirstDisplayedScrollingRowIndex that can be used in order to scroll to a row programmatically.
C#
int
jumpToRow = 20;
if
(dgv.Rows.Count >= jumpToRow && jumpToRow >= 1)
{
dgv.FirstDisplayedScrollingRowIndex = jumpToRow;
dgv.Rows[jumpToRow].Selected =
true
;
}
VB.NET
Dim
jumpToRow
As
Integer
= 20
If
dgv.Rows.Count >= jumpToRow
AndAlso
jumpToRow >= 1
Then
dgv.FirstDisplayedScrollingRowIndex = jumpToRow
dgv.Rows(jumpToRow).Selected =
True
End
If
Tip 7 - Calculate a column total in the DataGridView and display in a textbox
A common requirement is to calculate the total of a currency field and display it in a textbox. In the snippet below, we will be calculating the total of the ‘Freight’ field. We will then display the data in a textbox by formatting the result (observe the
ToString(
"c"
)
) while displaying the data, which displays the culture-specific currency.
C#
private
void
btnTotal_Click(
object
sender,
EventArgs
e)
{
if
(dgv.Rows.Count > 0)
txtTotal.Text = Total().ToString(
"c"
);
}
private
double
Total()
{
double
tot = 0;
int
i = 0;
for
(i = 0; i < dgv.Rows.Count; i++)
{
tot = tot +
Convert
.ToDouble(dgv.Rows[i].Cells[
"Freight"
].Value);
}
return
tot;
}
VB.NET
Private
Sub
btnTotal_Click(
ByVal
sender
As
Object
,
ByVal
e
As
EventArgs)
If
dgv.Rows.Count > 0
Then
txtTotal.Text = Total().ToString("c")
End
If
End
Sub
Private
Function
Total()
As
Double
Dim
tot
As
Double
= 0
Dim
i
As
Integer
= 0
For
i = 0
To
dgv.Rows.Count - 1
tot = tot + Convert.ToDouble(dgv.Rows(i).Cells("Freight").Value)
Next
i
Return
tot
End
Function
Tip 8 - Change the Header Names in the DataGridView
If the columns being retrieved from the database do not have meaningful names, we always have the option of changing the header names as shown in this snippet:
C#
private
void
btnChange_Click(
object
sender,
EventArgs
e)
{
dgv.Columns[0].HeaderText =
"MyHeader1"
;
dgv.Columns[1].HeaderText =
"MyHeader2"
;
}
VB.NET
Private
Sub
btnChange_Click(
ByVal
sender
As
Object
,
ByVal
e
As
EventArgs)
dgv.Columns(0).HeaderText = "MyHeader1"
dgv.Columns(1).HeaderText = "MyHeader2"
End
Sub
Tip 9 - Change the Color of Cells, Rows and Border in the DataGridView
C#
private
void
btnCellRow_Click(
object
sender,
EventArgs
e)
{
// Change ForeColor of each Cell
this
.dgv.DefaultCellStyle.ForeColor =
Color
.Coral;
// Change back color of each row
this
.dgv.RowsDefaultCellStyle.BackColor =
Color
.AliceBlue;
// Change GridLine Color
this
.dgv.GridColor =
Color
.Blue;
// Change Grid Border Style
this
.dgv.BorderStyle =
BorderStyle
.Fixed3D;
}
VB.NET
Private
Sub
btnCellRow_Click(
ByVal
sender
As
Object
,
ByVal
e
As
EventArgs)
' Change ForeColor of each Cell
Me
.dgv.DefaultCellStyle.ForeColor = Color.Coral
' Change back color of each row
Me
.dgv.RowsDefaultCellStyle.BackColor = Color.AliceBlue
' Change GridLine Color
Me
.dgv.GridColor = Color.Blue
' Change Grid Border Style
Me
.dgv.BorderStyle = BorderStyle.Fixed3D
End
Sub
Tip 10 - Hide a Column in the DataGridView
If you would like to hide a column based on a certain condition, here’s a snippet for that.
C#
private
void
btnHide_Click(
object
sender,
EventArgs
e)
{
this
.dgv.Columns[
"EmployeeID"
].Visible =
false
;
}
VB.NET
Private
Sub
btnHide_Click(
ByVal
sender
As
Object
,
ByVal
e
As
EventArgs)
Me
.dgv.Columns("EmployeeID").Visible =
False
End
Sub
Tip 11 - Handle SelectedIndexChanged of a ComboBox in the DataGridView
To handle the SelectedIndexChanged event of a DataGridViewComboBox, you need to use the DataGridView.EditingControlShowing event as shown below. You can then retrieve the selected index or the selected text of the combobox.
C#
private
void
dataGridView1_EditingControlShowing(
object
sender,
DataGridViewEditingControlShowingEventArgs
e)
{
ComboBox
editingComboBox = (
ComboBox
)e.Control;
if
(editingComboBox !=
null
)
editingComboBox.SelectedIndexChanged +=
new
System.
EventHandler
(
this
.editingComboBox_SelectedIndexChanged);
}
private
void
editingComboBox_SelectedIndexChanged(
object
sender, System.
EventArgs
e)
{
ComboBox
comboBox1 = (
ComboBox
)sender;
// Display index
MessageBox
.Show(comboBox1.SelectedIndex.ToString());
// Display value
MessageBox
.Show(comboBox1.Text);
}
VB.NET
Private
Sub
dataGridView1_EditingControlShowing(
ByVal
sender
As
Object
,
ByVal
e
As
DataGridViewEditingControlShowingEventArgs)
Dim
editingComboBox
As
ComboBox =
CType
(e.Control, ComboBox)
If
Not
editingComboBox
Is
Nothing
Then
AddHandler
editingComboBox.SelectedIndexChanged,
AddressOf
editingComboBox_SelectedIndexChanged
End
If
End
Sub
Private
Sub
editingComboBox_SelectedIndexChanged(
ByVal
sender
As
Object
,
ByVal
e
As
System.EventArgs)
Dim
comboBox1
As
ComboBox =
CType
(sender, ComboBox)
' Display index
MessageBox.Show(comboBox1.SelectedIndex.ToString())
' Display value
MessageBox.Show(comboBox1.Text)
End
Sub
Tip 12 - Change Color of Alternate Rows in the DataGridView
C#
private
void
btnAlternate_Click(
object
sender,
EventArgs
e)
{
this
.dgv.RowsDefaultCellStyle.BackColor =
Color
.White;
this
.dgv.AlternatingRowsDefaultCellStyle.BackColor =
Color
.Aquamarine;
}
VB.NET
Private
Sub
btnAlternate_Click(
ByVal
sender
As
Object
,
ByVal
e
As
EventArgs)
Me
.dgv.RowsDefaultCellStyle.BackColor = Color.White
Me
.dgv.AlternatingRowsDefaultCellStyle.BackColor = Color.Aquamarine
End
Sub
Tip 13 - Formatting Data in the DataGridView
The DataGridView exposes properties that enable you to format data such as displaying a currency column in the culture specific currency or displaying nulls in a desired format and so on.
C#
private
void
btnFormat_Click(
object
sender,
EventArgs
e)
{
// display currency in culture-specific currency for
this
.dgv.Columns[
"Freight"
].DefaultCellStyle.Format =
"c"
;
// display nulls as 'NA'
this
.dgv.DefaultCellStyle.NullValue =
"NA"
;
}
VB.NET
Private
Sub
btnFormat_Click(
ByVal
sender
As
Object
,
ByVal
e
As
EventArgs)
' display currency in culture-specific currency for
Me
.dgv.Columns("Freight").DefaultCellStyle.Format = "c"
' display nulls as 'NA'
Me
.dgv.DefaultCellStyle.NullValue = "NA"
End
Sub
Tip 14 – Change the order of columns in the DataGridView
In order to change the order of columns, just set the DisplayIndex property of the DataGridView to the desired value. Remember that the index is zero based.
C#
private
void
btnReorder_Click(
object
sender,
EventArgs
e)
{
dgv.Columns[
"CustomerID"
].DisplayIndex = 5;
dgv.Columns[
"OrderID"
].DisplayIndex = 3;
dgv.Columns[
"EmployeeID"
].DisplayIndex = 1;
dgv.Columns[
"OrderDate"
].DisplayIndex = 2;
dgv.Columns[
"Freight"
].DisplayIndex = 6;
dgv.Columns[
"ShipCountry"
].DisplayIndex = 0;
dgv.Columns[
"ShipName"
].DisplayIndex = 4;
}
VB.NET
Private
Sub
btnReorder_Click(
ByVal
sender
As
Object
,
ByVal
e
As
EventArgs)
dgv.Columns("CustomerID").DisplayIndex = 5
dgv.Columns("OrderID").DisplayIndex = 3
dgv.Columns("EmployeeID").DisplayIndex = 1
dgv.Columns("OrderDate").DisplayIndex = 2
dgv.Columns("Freight").DisplayIndex = 6
dgv.Columns("ShipCountry").DisplayIndex = 0
dgv.Columns("ShipName").DisplayIndex = 4
End
Sub
I hope this article was useful and I thank you for viewing it.
版权所有: 本文系米扑博客原创、转载、摘录,或修订后发表,最后更新于 2010-03-12 22:34:50
侵权处理: 本个人博客,不盈利,若侵犯了您的作品权,请联系博主删除,莫恶意,索钱财,感谢!
转载注明: DataGridViewinWindowsForms–Tips,TricksandFrequentlyAskedQuestions(FAQ) (米扑博客)