Domanda

E 'possibile ottenere un FormView per difetto automaticamente alla modalità ReadOnly sul record che ha appena inserito attraverso la sua InsertItemTemplate? Sembra che questo sarebbe somethign che dovrebbe venire naturalmente ad un FormView.

È stato utile?

Soluzione

Sì, è possibile.

sto dimostrando con la tabella Employee

utilizzare il seguente script Sql Server per creare dipendente presentato denominato 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

Il codice sorgente di inserimento record nella FormView è la seguente:

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>

e nel codice dietro pagina FormView.aspx incollare il seguente codice:

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();
}

Altri suggerimenti

C'è un'altra soluzione che è molto più semplice IMHO.

Utilizzando i dati di cui sopra (@ SK-INFOPOINT), vorrei scrivere le mie FormView1.aspx molto lo stesso con solo un paio di piccole modifiche alla modalità "sola lettura" di default e mettendo lo SQL Insert e comandi Seleziona nella SQLAdapter a guardare in questo modo:

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>

In questo modo i pulsanti e modelli per fare la maggior parte della funzionalità senza la necessità di codificare manualmente l'inserimento e selezione. Poi vorrei solo aggiungere questo nel codice dietro della pagina FormView.aspx il seguente codice:

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;
    }
}

E si sta visualizzando il nuovo elemento legato in modalità sola lettura. E, se si aggiunge un semplice modello di paging al FormView, è possibile navigare su e giù record tuttavia si prega di ...

:)

- Schnizzles

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top