Pregunta

I have a gridview and 2 buttons outside it. On button click all rows of gridview should become editable. I am using ITemplate class achive this task, but unable to complete it.

below is my code to get editable gridview:

public class GridViewTemplate : ITemplate
{
private DataControlRowType templateType;
private string columnName;
private string columnNameBinding;
private string controlType;

public GridViewTemplate(DataControlRowType type, string colname, string  colNameBinding, string ctlType)
{
    templateType = type;
    columnName = colname;
    columnNameBinding = colNameBinding;
    controlType = ctlType;
}

public void InstantiateIn(System.Web.UI.Control container)
{
    switch (templateType)
    {
        case DataControlRowType.Header:
            Literal lc = new Literal();
            lc.Text = columnName;
            container.Controls.Add(lc);
            break;
        case DataControlRowType.DataRow:
            if (controlType == "Label")
            {
                Label lb = new Label();
                lb.ID = "lblName";
                lb.DataBinding += new EventHandler(this.OnDataBinding);
                container.Controls.Add(lb);
            }
            else if (controlType == "TextBox")
            {
                TextBox tb = new TextBox();
                tb.ID = "txtWeightage" + columnNameBinding;
                tb.DataBinding += new EventHandler(this.OnDataBinding);
                container.Controls.Add(tb);
            }
            default:
            break;
    }
}
public void OnDataBinding(object sender, EventArgs e)
{
    object bound_value_obj = null;
    Control ctrl = (Control)sender;
    IDataItemContainer data_item_container = (IDataItemContainer)ctrl.NamingContainer;
    bound_value_obj = DataBinder.Eval(data_item_container.DataItem, columnName);

    switch (templateType)
    {
        case DataControlRowType.Header:
            Label lb = (Label)sender;
            lb.Text = bound_value_obj.ToString();
            break;
        case DataControlRowType.DataRow:
            TextBox txtbox = (TextBox)sender;
            txtbox.Text = bound_value_obj.ToString();
            break;
    }
}
}
¿Fue útil?

Solución

It's one sample :

This post demonstrate how to make a GridView editable all the time using C# asp.net.

step1-: Create a table with name " items" with following columns("iterm_no","name","price") where "iterm_no" is identity column.as describe below

 create table items
        (
           iterm_no int identity(1,1),
          name varchar(20),
          price numeric(10,2)
       )

step2- Now create a web page with name(EditableGridView). as describe below.

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

<!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>Editable GridView</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>

    <asp:GridView ID="GridView1" runat="server" AllowPaging="True" AutoGenerateColumns="False"
BackColor="White" BorderColor="#CCCCCC" BorderStyle="None" BorderWidth="1px"
CellPadding="3" DataKeyNames="INTERM_NO" >
<FooterStyle BackColor="White" ForeColor="#000066" />
<Columns>
<asp:BoundField DataField="INTERM_NO" HeaderText="ITEM_N0" InsertVisible="False" ReadOnly="True"
SortExpression="INTERM_NO" />
<asp:TemplateField HeaderText="NAME" SortExpression="NAME">
<ItemTemplate>
<asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("NAME") %>'
OnTextChanged="TextBox_TextChanged" BorderStyle="None"></asp:TextBox>
<asp:HiddenField ID="HiddenField1" runat="server" Value='<%# Eval("INTERM_NO") %>' />
</ItemTemplate>
</asp:TemplateField>


<asp:TemplateField HeaderText="PRICE" SortExpression="PRICE">
<ItemTemplate>
<asp:TextBox ID="TextBox2" runat="server" Text='<%# Bind("PRICE") %>'
OnTextChanged="TextBox_TextChanged" BorderStyle="None"></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>



</Columns>
<RowStyle ForeColor="#000066" />
<SelectedRowStyle BackColor="#669999" Font-Bold="True" ForeColor="White" />
<PagerStyle BackColor="White" ForeColor="#000066" HorizontalAlign="Left" />
<HeaderStyle BackColor="#006699" Font-Bold="True" ForeColor="White" />
</asp:GridView>
    </div>
    <asp:Button ID="btnUpdate" runat="server" onclick="btnUpdate_Click"
        Text="Update" />
    <asp:Label ID="lblMessage" runat="server"></asp:Label>
    </form>
</body>
</html>

step 3- Go to your code behind (EditableGridView.cs) as describe below.

using System;
using System.Configuration;
using System.Data;
using System.Web;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Data.SqlClient;

public partial class EditableGridView : System.Web.UI.Page
{

    SqlConnection con;
    bool[] rowChanged;
    protected void Page_Load(object sender, EventArgs e)
    {
        string conString = ConfigurationSettings.AppSettings["mycon"];
        con = new SqlConnection(conString);
        int totalRows = GridView1.Rows.Count;
        rowChanged = new bool[totalRows];
        if (!Page.IsPostBack)
        {
            BindGrid();
        }
    }

    public void BindGrid()
    {
        SqlDataAdapter adap = new SqlDataAdapter("select * from items", con);
        DataTable dt = new DataTable();
        adap.Fill(dt);
        GridView1.DataSource = dt;
        GridView1.DataBind();
    }

    protected void TextBox_TextChanged(object sender, EventArgs e)
    {
        TextBox thisTextBox = (TextBox)sender;
        GridViewRow thisGridViewRow = (GridViewRow)thisTextBox.Parent.Parent;
        int row = thisGridViewRow.RowIndex;
        rowChanged[row] = true;
    }



    protected void btnUpdate_Click(object sender, EventArgs e)
    {
        if (Page.IsPostBack)
        {
            int totalRows = GridView1.Rows.Count;
            for (int r = 0; r < totalRows; r++)
            {
                if (rowChanged[r])
                {
                    GridViewRow thisGridViewRow = GridView1.Rows[r];
                    HiddenField hf1 = (HiddenField)thisGridViewRow.FindControl("HiddenField1");
                    string pk = hf1.Value;
                    TextBox tb1 = (TextBox)thisGridViewRow.FindControl("TextBox1");
                    string name = tb1.Text;
                    TextBox tb2 = (TextBox)thisGridViewRow.FindControl("TextBox2");
                    decimal price = Convert.ToDecimal(tb2.Text);

                    SqlCommand cmd = new SqlCommand("update items set name='" + name + "' , price='" + price + "' where INTERM_NO=' " + pk + "'", con);
                    if (con.State == ConnectionState.Closed)
                    {
                        con.Open();
                    }
                    int temp = cmd.ExecuteNonQuery();
                    if (temp > 0)
                    {
                        lblMessage.Text = "Operation perform successfully";
                        con.Close();
                    }


                }
            }
            GridView1.DataBind();
            BindGrid();
        }
    }
}

Note: If you have any query or question about this post contact us:

or try this . this link was helpful for your requirement

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top