Skip to main content
Email Password   helpLost your password?

Introduction

This code drop is part of a Smash and Grab series for the seriously ADD (Attention Deficit Disorder) programmer. I'll bet there are a lot of other programmers out there who would like to make code available to others, but just don't want to spend the hours required to create a full-blown "CodeProject" article. This is an attempt to see if I can make some useful code available to other programmers, and do it in 10 minutes. I encourage others to contribute to "Smash and Grab".

The point of this series is to present usable pre-canned classes or techniques which solve a real world problem without going into too much detail about how it works. I mean, who really cares about how System.Collections.ArrayList works, you just use it.

Please fully comment the code so that the person who really cares (and has the time) will be able to understand the underlying algorithm.

Using the code

There has been a lot of whining on the net about what a train-wreck the ASP.NET 2.0 GridView is because it won't do inserts and if the table source is empty, the grid does not even render.

Here is a solution in less than 15 lines of code.

OnRowUpdating is called by the GridView before it updates a row. The GridView thinks it is doing an update to CategoryID=0 (which will silently fail). Meanwhile, you are scooping the data and doing a secret insert.

<%@ Page Language="C#" AutoEventWireup="true" 
             CodeFile="AddUpdate.aspx.cs" Inherits="AddUpdate" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
    <script>
    function FixGrid(idGrid)
    {
      // content looks like:

      //"<A href=\"javascript:__doPostBack('GridView1',

      //    'Edit$0')\">Edit</A> 

      // <A href=\"javascript:__doPostBack('GridView1',

      //    'Delete$0')\">Delete</A>"

      // replace Edit with Add, remove Delete

      var Parts = 
       idGrid.firstChild.childNodes[1].childNodes[0].innerHTML.split(">Edit<");
      var tmp = Parts.join(">Add<"); 
      Parts = tmp.split(">Delete<");
      idGrid.firstChild.childNodes[1].childNodes[0].innerHTML = 
                                        Parts.join("><");
    }
    </script>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:GridView ID="GridView1" runat="server" 
                 AutoGenerateColumns="False" DataKeyNames="CategoryID"
            DataSourceID="SqlDataSource1" 
                    OnRowUpdating="GridView1_RowAdding">
            <Columns>
                <asp:CommandField ShowDeleteButton="True" 
                    ShowEditButton="True" />
                <asp:BoundField DataField="CategoryID" 
                    HeaderText="CategoryID" InsertVisible="False"
                    ReadOnly="True" SortExpression="CategoryID" />
                <asp:BoundField DataField="CategoryName" 
                       HeaderText="CategoryName" 
                       SortExpression="CategoryName" />
                <asp:BoundField DataField="Description" 
                       HeaderText="Description" 
                       SortExpression="Description" />
            </Columns>
        </asp:GridView>
        <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
              ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>"
            DeleteCommand="DELETE FROM [Categories] 
                           WHERE [CategoryID] = @CategoryID"
            InsertCommand="INSERT INTO [Categories] 
                           ([CategoryName], [Description]) 
                           VALUES (@CategoryName, @Description)"
            SelectCommand="SELECT '' as [CategoryID], 
                '' as [CategoryName], '' as [Description]
                UNION SELECT [CategoryID], [CategoryName], 
                convert(nvarchar(1000),[Description])
                FROM [Categories]" 
            UpdateCommand="UPDATE [Categories] SET 
                           [CategoryName] = @CategoryName, 
                           [Description] = @Description 
                           WHERE [CategoryID] = @CategoryID">
            <DeleteParameters>
                <asp:Parameter Name="CategoryID" Type="Int32" />
            </DeleteParameters>
            <UpdateParameters>
                <asp:Parameter Name="CategoryName" Type="String" />
                <asp:Parameter Name="Description" Type="String" />
                <asp:Parameter Name="CategoryID" Type="Int32" />
            </UpdateParameters>
            <InsertParameters>
                <asp:Parameter Name="CategoryName" Type="String" />
                <asp:Parameter Name="Description" Type="String" />
            </InsertParameters>
        </asp:SqlDataSource>
    
    </div>
    </form>
        <script>
            FixGrid(document.all.GridView1);
        </script>
</body>
</html>
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class AddUpdate : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void GridView1_RowAdding(object sender, 
                        GridViewUpdateEventArgs e)
    {
        if (e.RowIndex > 0)
            return; // RowIndex=0 is the row we want to insert

        System.Collections.Hashtable h = 
                    new System.Collections.Hashtable();

        foreach (System.Collections.DictionaryEntry x in e.NewValues)
        {
            h[x.Key] = x.Value;
        }
        // you now have the data to insert in a hashtable

        // get it into the database using your

        // usual Data Access Layer methods


    }
}
You must Sign In to use this message board.
 
 
Per page   
 FirstPrevNext
GeneralEliminating GridView1_RowAdding Pin
Roy Oliver
8:25 6 Aug '09  
GeneralRe: Eliminating GridView1_RowAdding Pin
Roy Oliver
10:20 6 Aug '09  
GeneralGridview Pin
ksarchana
1:47 3 Jan '09  
GeneralCorrected javascript for IE, FF, and Safari Pin
karen_webexc
5:12 30 Jul '08  
GeneralPls provide the code for inserting data in hashtable using DAL Pin
Member 3159987
8:21 23 Jul '08  
QuestionHow to place data from SQLSERVER into gridview and then edit and delete data Pin
waseemtalib
19:55 27 May '08  
GeneralAlternative insert/update code Pin
Paul /)/+)
1:52 16 Oct '07  
QuestionWorks great except for Paging & Sorting... Pin
imxuf
13:46 17 Jul '07  
GeneralHere is how you can make it work on multiple GridViews Pin
HamidTheProgrammer
11:42 28 Mar '07  
GeneralDoes't Work Pin
3:40 21 Mar '07  
GeneralAnother method to change to ADD link - Use RowDataBound [modified] Pin
dbernett
7:15 15 Nov '06  
GeneralRe: Another method to change to ADD link - Use RowDataBound Pin
ccshine
13:42 5 Dec '06  
GeneralBut, if we use sorting for the same grid Pin
kvPriya
19:41 5 Oct '06  
GeneralI fix the javascript for the linkbutton names. Check it out! Pin
kampfer!
10:52 24 Sep '06  
Questiondoesnt work with strongly typed datasets Pin
xgnitesh
21:52 13 Sep '06  
QuestionRe: doesnt work with strongly typed datasets [modified] Pin
rbm_the_spitfire
23:09 2 Oct '06  
GeneralGood, but the Edit,Delete are not being replaced by Add Pin
kvPriya
19:38 8 Sep '06  
GeneralRe: Good, but the Edit,Delete are not being replaced by Add Pin
zwitterion
8:55 14 Sep '06  
GeneralRe: Good, but the Edit,Delete are not being replaced by Add Pin
Vincent D'Souza
6:55 25 Oct '06  
GeneralGreat! but some issues Pin
Thouseeque
20:53 7 Sep '06  
Generalgreat but limited? Pin
zwitterion
12:38 30 Aug '06  
GeneralRe: great but limited? Pin
Michael Freidgeim
18:14 1 Sep '06  
QuestionidGrid.firstChild.childNodes[0] has no properties Pin
bevrigy
14:08 17 Aug '06  
GeneralIf using a Master Page... Pin
llennox
7:05 23 Jul '06  
GeneralGreat info, thanks Pin
Hotcut
2:04 19 Jul '06  


Last Updated 19 Dec 2005 | Advertise | Privacy | Terms of Use | Copyright © CodeProject, 1999-2009