Search code examples
asp.netdata-bindingformview

Automatically bind ASP.NET FormView to newly inserted record


Is it possible to get a FormView to automatically default to ReadOnly mode on the record that it has just inserted via its InsertItemTemplate? It seems like this would be somethign that should come naturally to a FormView.


Solution

  • Yes, It is possible.

    I am demonstrating it with the Employee table

    Use the following Sql Server script to create employee tabled named tbemployee

    CREATE TABLE [dbo].[tbemployee](
    [empid] [int] IDENTITY(1,1) NOT NULL,
    [ename] [varchar](50) NULL,
    [eadd] [varchar](50) NULL,
    [esal] [int] NULL,
    [edno] [int] NULL, 
    
    CONSTRAINT [PK_tbemployee] PRIMARY KEY CLUSTERED 
    (
        [empid] ASC
    )
    ) ON [PRIMARY]
    GO
    

    The source code for Inserting record into FormView is shown below:

    FormView.aspx

    <asp:FormView ID="FormView1" runat="server" DataKeyNames="empid" 
            oniteminserting="FormView1_ItemInserting" DefaultMode="Insert"
            onmodechanging="FormView1_ModeChanging">            
            <InsertItemTemplate>
                ename:
                <asp:TextBox ID="txtename" runat="server" Text='<%# Bind("ename") %>' />
                <br />
                eadd:
                <asp:TextBox ID="txteadd" runat="server" Text='<%# Bind("eadd") %>' />
                <br />
                esal:
                <asp:TextBox ID="txtesal" runat="server" Text='<%# Bind("esal") %>' />
                <br />
                edno:
                <asp:TextBox ID="txtedno" runat="server" Text='<%# Bind("edno") %>' />
                <br />
                <asp:LinkButton ID="InsertButton" runat="server" CausesValidation="True" 
                    CommandName="Insert" Text="Insert" />
                &nbsp;<asp:LinkButton ID="InsertCancelButton" runat="server" 
                    CausesValidation="False" CommandName="Cancel" Text="Cancel" />
            </InsertItemTemplate>
            <ItemTemplate>
                empid:
                <asp:Label ID="empidLabel" runat="server" Text='<%# Eval("empid") %>' />
                <br />
                ename:
                <asp:Label ID="enameLabel" runat="server" Text='<%# Bind("ename") %>' />
                <br />
                eadd:
                <asp:Label ID="eaddLabel" runat="server" Text='<%# Bind("eadd") %>' />
                <br />
                esal:
                <asp:Label ID="esalLabel" runat="server" Text='<%# Bind("esal") %>' />
                <br />
                edno:
                <asp:Label ID="ednoLabel" runat="server" Text='<%# Bind("edno") %>' />
                <br />
                <asp:LinkButton ID="NewButton" runat="server" CausesValidation="False" 
                    CommandName="New" Text="New" />
            </ItemTemplate>
        </asp:FormView>
        <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
            ConnectionString="Data Source=gts7;Initial Catalog=dbemp14;Integrated Security=True;Pooling=False"             
            ProviderName="System.Data.SqlClient">           
        </asp:SqlDataSource>
    

    and in the Code Behind of FormView.aspx page paste the following code:

    FormView.aspx.cs

    using System;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Data;
    using System.Data.SqlClient;
    using System.Configuration;
    
    public partial class _Default : System.Web.UI.Page 
    {
        SqlConnection con=new SqlConnection(ConfigurationManager.ConnectionStrings["cn"].ConnectionString);
    
    protected void Page_Load(object sender, EventArgs e)
    {
    
    }
    
    protected void FormView1_ItemInserting(object sender, FormViewInsertEventArgs e)
        {
            string ename, eadd,insertqry;
            Int32 esal, edno;
            ename = ((TextBox)(FormView1.FindControl("txtename"))).Text;
            eadd = ((TextBox)(FormView1.FindControl("txtename"))).Text;
            esal = Convert.ToInt32(((TextBox)(FormView1.FindControl("txtesal"))).Text);
            edno = Convert.ToInt32(((TextBox)(FormView1.FindControl("txtedno"))).Text);
    
        insertqry="insert tbemployee(ename,eadd,esal,edno) values(@ename,@eadd,@esal,@edno)";
    
        if (con.State == ConnectionState.Closed)
        {
            con.Open();
        }
    
        SqlCommand cmd = new SqlCommand(insertqry, con);
        cmd.Parameters.Add("@ename", SqlDbType.VarChar, 50).Value = ename;
        cmd.Parameters.Add("@eadd", SqlDbType.VarChar, 50).Value = eadd;
        cmd.Parameters.Add("@esal", SqlDbType.Int).Value = esal;
        cmd.Parameters.Add("@edno", SqlDbType.Int).Value = edno;
    
        cmd.ExecuteNonQuery();
        cmd.Dispose();
        con.Close();
    
        FormView1.ChangeMode(FormViewMode.ReadOnly);
        formbind();
    }
    
    public void formbind()
    {
        if (FormView1.AllowPaging == true)
        {
            SqlDataAdapter adp = new SqlDataAdapter("select * from tbemployee", con);
            DataSet ds = new DataSet();
            adp.Fill(ds);
    
            Int32 totrecords = ds.Tables[0].Rows.Count;
            Int32 currentpageindex = totrecords - 1;
            FormView1.PageIndex = currentpageindex;
            FormView1.DataSource = ds;
            FormView1.DataBind();
        }
        else
        {
            SqlDataAdapter adp = new SqlDataAdapter("select * from tbemployee where empid in (select isnull(max(empid),0) from tbemployee)", con);
            DataSet ds = new DataSet();
            adp.Fill(ds);
            FormView1.DataSource = ds;
            FormView1.DataBind();
        }
    }
    
    protected void FormView1_ModeChanging(object sender, FormViewModeEventArgs e)
    {
        FormView1.ChangeMode(e.NewMode);
        formbind();
    }