【问题标题】:Automatically bind ASP.NET FormView to newly inserted record自动将 ASP.NET FormView 绑定到新插入的记录
【发布时间】:2011-01-14 03:40:27
【问题描述】:

是否可以让 FormView 在刚刚通过其 InsertItemTemplate 插入的记录上自动默认为 ReadOnly 模式?看起来这对 FormView 来说应该是自然而然的事情。

【问题讨论】:

    标签: asp.net data-binding formview


    【解决方案1】:

    恕我直言,还有另一种更简单的解决方案。

    使用上述 (@SK-INFOPOINT) 数据,我将编写非常相同的 FormView1.aspx,只需对默认为“ReadOnly”模式进行一些小的更改,并将 SQL 插入和选择命令放入 SQLAdapter看起来像这样:

    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>
    

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

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

    您正在以只读模式显示绑定的新项目。而且,如果您在 FormView 中添加一个简单的分页模板,您可以随意上下浏览记录...

    :)

    -- 炸猪排

    【讨论】:

      【解决方案2】:

      是的,有可能。

      我用 Employee 表来演示它

      使用以下 Sql Server 脚本创建名为 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
      

      FormView插入记录源码如下:

      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>
      

      并在 FormView.aspx 页面的代码后面粘贴以下代码:

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

      【讨论】:

        猜你喜欢
        • 2010-11-10
        • 1970-01-01
        • 2011-08-23
        • 2015-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-18
        相关资源
        最近更新 更多