代码之家  ›  专栏  ›  技术社区  ›  ProfK

自动将ASP.NET窗体视图绑定到新插入的记录

  •  6
  • ProfK  · 技术社区  · 15 年前

    是否可以使FormView在刚通过InsertItemTemplate插入的记录上自动默认为只读模式?这似乎是一个自然形成的观点。

    2 回复  |  直到 13 年前
        1
  •  1
  •   SK INFOPOINT    14 年前

    是的,这是可能的。

    我正在员工桌上演示

    使用以下SQL Server脚本创建名为 待定员工

    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
    

    将记录插入表单视图的源代码如下所示:

    Apvest.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>
    

    在formview.aspx页面后面的代码中粘贴以下代码:

    窗体视图.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();
    }
    
        2
  •  1
  •   Schnizzles    13 年前

    还有另一个更简单的解决方案imho。

    使用上面的(@sk-infopoint)数据,我编写的formview1.aspx非常相同,只需对默认的“readonly”模式进行一些小的更改,并将SQL插入和选择命令放入sqladapter中,如下所示:

    窗体视图1.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>
    

    这允许按钮和模板执行大部分功能,而无需手动编码插入和选择。然后,我将只在formview.aspx页面后面的代码中添加以下代码:

    窗体视图.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;
        }
    }
    

    您正在以只读模式显示绑定的新项目。而且,如果您向窗体视图中添加一个简单的分页模板,您可以在记录中上下导航,但是请…

    :)

    ——Schnizzles

    推荐文章