Automatically bind ASP.NET FormView to newly inserted record

Is it possible to get a FormView automatically by default in ReadOnly mode in the record that it just inserted through its InsertItemTemplate? It seems like this would be something that should happen naturally in FormView.

+6
data-binding formview
source share
2 answers

Yes it is possible.

I demonstrate it using the Employee table

Use the following Sql script server to create an employee 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 an entry into a 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 on 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(); } 
+1
source share

There is another solution, which is much simpler IMHO.

Using the above data (@ SK-INFOPOINT), I would write my FormView1.aspx in exactly the same way, with only a few minor changes by default in the ReadOnly mode and setting the SQL Insert and Select commands to SQLAdapter to look like this:

FormView1.aspx

 <asp:FormView ID="FormView1" runat="server" DataKeyNames="empid" oniteminserting="FormView1_ItemInserting" DefaultMode="ReadOnly" 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" SelectCommand="select * from tbemployee" InsertCommand="insert into tbemployee (ename,eadd,esal,edno) values (@ename, @eadd, @esal, @edno)"> </asp:SqlDataSource> 

This allows buttons and templates to perform most of the functionality without having to manually code the insert and selection. Then I would add only this on the Code Behind of FormView.aspx page, the following code:

FormView.aspx.cs

 using System; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Data; public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void FormView1_ItemInserted(object sender, FormViewInsertedEventArgs e) { DataView dv = (DataView)SqlDataSource1.Select(DataSourceSelectArguments.Empty); FormView1.PageIndex = dv.Count - 1; } } 

And you show your linked new item in ReadOnly mode. And if you add a simple swap template to your FormView, you can move up and down posts as you like ...

:)

- schnizzles

+1
source share

All Articles