Sai Avinash
Sai Avinash

Reputation: 4753

How to bulk edit a single column in a grid view

I am working on an ASP.net application ( c#) . In it I have a grid view with columns displayed as ItemTemplates. I want to edit the values of one column.

I have an update button below the grid view. So when I click on update, the new values should be updated to the database.

I am using a list collection to bind the data to grid view.

I have no idea how to accomplish this.

Upvotes: 0

Views: 1907

Answers (4)

Sevin7
Sevin7

Reputation: 6492

I created a full working demo and tested it:

GridBulkEdit.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="GridBulkEdit.aspx.cs" Inherits="GridBulkEdit" EnableViewState="true" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server"> 

       <% /*1. Enter the new value for the column to be updated in the 'NewValue' textbox
            2. Check the 'UpdateThisRow' checkbox in the gridview for all rows that need to be updated.            
            3. Click the 'Update' button */%>

       New Value: <asp:TextBox runat="server" ID="NewValue_TextBox"></asp:TextBox>        
        <asp:Button runat="server" ID="Update_Button" Text="Update Checked Rows With New Value" OnClick="Update_Button_Click" />

      <% /* Assuming grid is bound to datasource with 2 columns: 
            1. 'PrimaryKeyField' - the primary key for each row 
            2. 'CurrentValue' - the value that we want to batch update */%>

        <asp:GridView runat="server" ID="grid" AutoGenerateColumns="false">
            <Columns>
                <asp:TemplateField>
                    <ItemTemplate>
                        <asp:HiddenField runat="server" ID="PrmaryKeyForThisRow_HiddenField" Value='<%# Bind("PrimaryKeyField") %>' />    
                        <asp:CheckBox runat="server" ID="UpdateThisRow_CheckBox"  Checked="false" ToolTip="Check this box to update this row"/>                        
                        <asp:Label runat="server" ID="CurrentValue_Label"  Text='<%# Bind("CurrentValue") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>
        <asp:Label runat="server" ID="TestOutput_Label"></asp:Label>        
    </form>
</body>
</html>

GridBulkEdit.aspx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.UI.WebControls;
using System.Data;

public partial class GridBulkEdit : System.Web.UI.Page
{
    protected void Page_PreInit(object sender, EventArgs e)
    {
        //Create a data table to bind the grid
        DataTable DT = new DataTable();
        DT.Columns.Add("PrimaryKeyField");
        DT.Columns.Add("CurrentValue");

        DataRow DR1 = DT.NewRow();
        DR1["PrimaryKeyField"] = 1;
        DR1["CurrentValue"] = "value one";
        DT.Rows.Add(DR1);

        DataRow DR2 = DT.NewRow();
        DR2["PrimaryKeyField"] = 2;
        DR2["CurrentValue"] = "value two";
        DT.Rows.Add(DR2);

        DataRow DR3 = DT.NewRow();
        DR3["PrimaryKeyField"] = 3;
        DR3["CurrentValue"] = "value three";
        DT.Rows.Add(DR3);

        grid.DataSource = DT;
        grid.DataBind();
    }

    protected void Update_Button_Click(object sender, EventArgs e)
    {
        TestOutput_Label.Text = "";
        for (int i = 0; i < grid.Rows.Count; i++)
        {
            HiddenField PrmaryKeyForThisRow_HiddenField = grid.Rows[i].FindControl("PrmaryKeyForThisRow_HiddenField") as HiddenField;
            CheckBox UpdateThisRow_CheckBox = grid.Rows[i].FindControl("UpdateThisRow_CheckBox") as CheckBox;
            if (UpdateThisRow_CheckBox.Checked)
            {
                UpdateRow(PrmaryKeyForThisRow_HiddenField.Value);
            }
        }       
    }

    private void UpdateRow(object PrimaryKey)
    {
        object NewValue = NewValue_TextBox.Text;
        //Execute SQL query to update row with the passed PrimaryKey with the NewValue
        TestOutput_Label.Text += "<br/> Update row whose PrimaryKey is: " + PrimaryKey + " with new value: " + NewValue;
    }
}

Upvotes: 1

ZombieSheep
ZombieSheep

Reputation: 29953

If you are using a GridView, are you also using a backing object (some sort of collection) to bind to the grid rows - it seems likely since you are using ItemTemplates to display them.

In this case, can you access the items you wish to change from this backing collection?

EDIT

Comment says that you're using a list to bind the grid, so why not make your changes to the list items and send those back to the database?

foreach(var listItem in MyList)
{
    listItem.ThingToChange = newValueForThisProperty;
}
SubmitChangesToDatabase(MyList);

Upvotes: 1

Suraj Singh
Suraj Singh

Reputation: 4069

foreach(GridViewRow row in GridView1.Rows) 
   {
     if(row.RowType == DataControlRowType.DataRow) 
       {        

            String str = ((txtbx)(row.Cells[2].Controls[0])).Text;

        }
    }

Check your cell value for textbox.

Upvotes: 1

Bibhu
Bibhu

Reputation: 4081

Lets say you have TextBox inside the column, where the user is going to update new values. You can iterate through the gridview rows, in this manner

foreach(GridViewRow row in GridView1.Rows) {
    if(row.RowType == DataControlRowType.DataRow) {

        TextBox txtbx= row.FindControl("txtbx") as TextBox;
        //using the txtbx you can get the new values and update then to the db
    }
}

Upvotes: 3

Related Questions