
Introduction
This article is a tutorial on how to create a WinForms selectable datagridview
with a separate Form for editing detail row data using a strongly typed DataSet
data layer. We will use Visual Studio 2005 and .NET 2.0.
Background
Creating an editable datagrid
is a very straightforward way to edit a datagrid
's values, but sometimes a separate editable Form
/UserControl
is desired (increased flexibility, more detail, etc.). This example will load the editable fields and lookups with the grid on Form load. This will keep us from having to synchronize and manage separate instances of similar data and will reduce round trips to the database. When dealing with lots of records, you would want to implement a where
filter in your query. We will include a Save
button on the Edit form. The Save
button could just as easily be implemented on the main form. The edit form could also be changed to a UserControl
to display on the main form instead of a popup.
Walkthrough
1. Add a DataSource (Strongly typed dataset)
2. Create the DataGridView
3. Create the Edit Form
- Open the
Order
form in design view. - Change the
NorthwindDataSet.Orders
table in the DataSources
Window from DataGridView
to Details
.

- Drag the detail table from the
DataSources
Window onto the Order
form. This will create the 3 controls on the form as well as the DataSet
, BindingSource
, TableAdapter
, and BindingNavigator
. - Delete the
BindingNavigator
. - Drop a
Button
control on the form and rename it ButtonSave
. - Click each
ComboBoxes
' "Smart Tag" to edit the DataSource
, DisplayMember
, SelectedValue
, and ValueMember
properties as we did earlier with the GridViewComboBoxColumns
.
You must check the Use data bound items
option to edit these values.


- This will create
BindingSource
and TableAdapter
components on the form for the Employees
and Customers
tables. - Delete the corresponding
TableAdapters
(Not the OrdersTableAdapter
) since we will be filling these tables from the Orders
form. - Set the
DataBindings.Text
property to None
since we're now binding to the SelectedValue
property.

4. Instantiate the Edit Form
- Create a Sub
New()
in the Edit Form.

- Double-click the
Save
button in design mode to create a click event handler. - Use the following code (fix any naming differences):
Private Sub Orders_FormClosing(ByVal sender As Object, _
ByVal e As System.Windows.Forms.FormClosingEventArgs) _
Handles Me.FormClosing
Me.NorthwindDataSet.Orders(Me.OrdersBindingSource.Position)._
RejectChanges()
End Sub
Private Sub ButtonSave_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles ButtonSave.Click
Me.Validate()
Me.OrdersBindingSource.EndEdit()
If Not Me.OrdersTableAdapter.Update(Me.NorthwindDataset.Orders) > 0 _
Then
MsgBox("No records were updated.")
End If
Me.Close()
End Sub
Public Sub New(ByVal nwDataSet As NorthwindDataSet, _
ByVal position As Integer)
InitializeComponent()
Me.NorthwindDataset = nwDataSet
Me.OrdersBindingSource.DataSource = Me.NorthwindDataSet
Me.CustomersBindingSource.DataSource = Me.NorthwindDataSet
Me.EmployeesBindingSource.DataSource = Me.NorthwindDataSet
Me.OrdersBindingSource.Position = position
End Sub
Private Sub Order_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
End Sub
Note
In Sub New
, we will pass in the dataset
created and filled with the grid. We then point the local NorthwindDataSet
variable to the existing dataset
. This does not change the properties already set in InitializeComponent
for the DataSet
, so we must reconfigure the other elements on the form to point to the existing DataSet
. Fortunately, the BindingSources
provide abstraction. We need only reset the 3 BindingSources
' DataSource
properties. We then set the BindingSource
position so the form knows which record to edit.
- On Save click, we will save the changes and exit.
- Finally on form close, we undo any changes that were not saved, because the
dataset
is shared with the grid.
5. Code the DataGridView Double-click event
- Open the
Orders
form in code view. - Create a
RowHeaderMouseDoubleClick
event handler.

- Create a
FormClosing
event handler. - Use the following code (fix any naming differences):
Private Sub Orders_FormClosing(ByVal sender As Object, _
ByVal e As System.Windows.Forms.FormClosingEventArgs) _
Handles Me.FormClosing
Me.OrdersDataGridView.Dispose()
End Sub
Private Sub Orders_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
Me.EmployeesTableAdapter.Fill(Me.NorthwindDataSet.Employees)
Me.CustomersTableAdapter.Fill(Me.NorthwindDataSet.Customers)
Me.OrdersTableAdapter.Fill(Me.NorthwindDataSet.Orders)
End Sub
Private Sub OrdersDataGridView_RowHeaderMouseDoubleClick_
(ByVal sender As Object, ByVal e _
As System.Windows.Forms.DataGridViewCellMouseEventArgs) _
Handles OrdersDataGridView.RowHeaderMouseDoubleClick
If Me.OrdersDataGridView.SelectedRows.Count > 0 Then
Dim editForm As New Order(Me.NorthwindDataSet, _
Me.NorthwindDataSet.Orders.Rows.IndexOf_
(CType(CType(Me.OrdersDataGridView.SelectedRows(0)._
DataBoundItem, DataRowView).Row, NorthwindDataSet.OrdersRow)))
editForm.Show()
End If
End Sub
Note
The DataSet
is filled on form load. The tableadapter
fill statements were created by configuring the BindingSource
. We have to dispose of the grid before the form closes to avoid possible DataErrors
from the GridViewComboBoxColumns
.
The Double-click event instantiates the detail edit form, passing in the DataSet
and the position. The position is found by tracking the selected row back to its row instance in the order table, then finding the index of that row in the dataset
.
Sacramento, CA based Senior .Net and SharePoint Solution Architect for
Kiefer Consulting
(1-800-794-1928)
B.S. in Mathematics from UCDavis
.NET Wizard - Experts-Exchange
MCSD, MCTS: MOSS 2007 Config
Some of the bigger questions:
1. What is the meaning of my life?
To satisfy the purpose of your creator(s). (Meaning must derive from purpose. Those who create you, give you meaning.)
2. Who is my creator?
Ultimately, God is your creator. God designed and created the universe and everything in it. You and others in your life can also be a part of your creation, overriding or furthering God's purpose.
3. What is God's purpose for me?
To love and be loved by your creator and others and to enjoy the life you've been given.
This can be distinguished two ways.
a. Use your built in common sense (morality/feelings)
b. Use the creator's handbook. Fortunately our creator did not abandon us. He is with us now and even lived and died as one of us. Check out his biography in "The Bible"
Note on free-will vs. predetermination:
God exists outside the constraints of time. He exists at every point in time simultaneously and knew of your birth and every decision you will/have made. But this does not mean God predetermined any of it. Pre and post are time related concepts that do not apply to God. God always has been and always will be. He determines our universe to exist, gives it the parameters of natural law, and allows us to make our own way through it (free-will). Note that these are all present tense, it would be more appropriate to use past, present, and future tense combined. God's purpose is for us to love him and one another. But a prerequisite of love is the free-will to love. So even though God wants us to love him/others, he can not ensure it. He can, however, help us if we allow him to. A miracle is God modifying natural parameters in response to human will.