【问题标题】:Insert data from a Repeater's textbox into a database将中继器文本框中的数据插入数据库
【发布时间】:2016-03-24 18:48:22
【问题描述】:

我正在使用带有标签和文本框的中继器。它根据表中的列(名字、姓氏、地址等)生成正确的标签。用户需要在相应的文本框中输入他们的信息。

在此之后,我需要一种方法将他们的数据从文本框中插入到我的数据库中。但是,我不确定如何将每个项目插入到数据库的正确列中。我正在使用存储过程,所以它会是这样的:

sqlCmd.Parameters.Add("@FirstName", SqlDbType.Int).Value = firstName.Text;

当然,当我拥有的唯一文本框是重复的 txtData 时,我无法识别 firstName.Text。

foreach (RepeaterItem rpItem in RepeaterForm.Items)
                    {
                        Label lblData = rpItem.FindControl("lblData") as Label;
                        TextBox txtData = rpItem.FindControl("txtData") as TextBox;

                        if (txtData != null)
                        {
                            sqlCmd.Connection = sqlConn;
                            sqlCmd.CommandType = CommandType.StoredProcedure;
                            sqlCmd.CommandText = "spInsFormFields";
                            sqlCmd.Parameters.Clear();
                            
                          //Code here
                           
                            sqlCmd.ExecuteNonQuery();
                        }
       }

一个示例中继器表单可能如下所示:

名字:约翰

姓:史密斯

地址:樱桃巷 123 号

我的数据库示例如下:

注册表

名字、姓氏、地址列

提交按钮应根据EventIdFormId(我之前在代码中收集的)输入一行

编辑:

这是我的中继器代码(根据要求):

   <asp:Repeater ID="RepeaterForm" runat="server" OnItemCommand="RepeaterForm_ItemCommand">
   <ItemTemplate>
       <table>
            <tr>
                <td><asp:Label ID="lblData" runat="server" Text='<%# Eval("MyColumn") %>'></asp:Label></td>
                 <td><asp:TextBox ID="txtData" runat="server"></asp:TextBox>
                     <br></br></td>
       </tr>
       </table>
   </ItemTemplate>
        <FooterTemplate><asp:Button ID="BtnSubmit" runat="server" Text="Submit" OnClick="BtnSubmit_Click" /></FooterTemplate>
            </asp:Repeater>

【问题讨论】:

  • 您的具体问题是什么?您的 SP 接受所有参数 First Name, Last Name, Address, 等,并且在您的 SP 中,您可能正在将数据插入相应的列,对吧?
  • 请出示您的转发器标记,这将有助于识别您的问题。
  • 嗯,我希望它足够聪明,可以自己生成参数等。这将用于许多具有许多差异字段的自定义表单。例如,有些表单会有地址字段,而有些则没有。
  • @RockOn - 但是您仍然应该将所有这些库放在一个物理表中,对吗?
  • 我可以添加我的代码供您早上查看。 (目前在我的手机上,我面前没有我的代码。)谢谢!

标签: c# asp.net repeater


【解决方案1】:

像这样准备你的中继器:

 <form id="form1" runat="server">
    <div>
        <asp:Repeater ID="Repeater1" runat="server">
            <ItemTemplate>
                <input type="text"  name='<%#Eval("ColumnName") %>' />
            </ItemTemplate>
        </asp:Repeater>           
        <asp:Button ID="btnSave" runat="server" Text="Button" OnClick="btnSave_Click" />
    </div>
</form>

通过使用这段 C# 代码,您可以动态获取所有值:

 public partial class WebForm1 : System.Web.UI.Page
{
    List<Column> Columns = new List<Column>();
    protected void Page_Init(object sender, EventArgs e)
    {
        Columns.Add(new Column { ColumnName = "ID" });
        Columns.Add(new Column { ColumnName = "Name" });
        Columns.Add(new Column { ColumnName = "Surname" });
    }
    protected void Page_Load(object sender, EventArgs e)
    {
        Repeater1.DataSource = Columns;
        Repeater1.DataBind();
    }
    protected void btnSave_Click(object sender, EventArgs e)
    {
        Dictionary<string, string> Values = new Dictionary<string, string>();
        foreach (var item in Columns)
        {
            Values.Add(item.ColumnName, Request.Form[item.ColumnName]);
        }
    }
}
class Column
{
    public string ColumnName { get; set; }
}

【讨论】:

  • 谢谢。我会在早上尝试这第一件事。
【解决方案2】:

假设txtFirstname,txtLastname,txtAddress是中继器中各个控件的名称,那么您可以使用以下代码访问它们:

 foreach (RepeaterItem rpItem in RepeaterForm.Items)
            {
                TextBox tFirstname = rpItem.FindControl("txtFirstname") as TextBox;
                TextBox tLastname = rpItem.FindControl("txtLastname") as TextBox;
                TextBox tAddress = rpItem.FindControl("txtAddress") as TextBox;
                sqlCmd.Connection = sqlConn;
                sqlCmd.CommandType = CommandType.StoredProcedure;
                sqlCmd.CommandText = "spInsFormFields";
                sqlCmd.Parameters.Clear();
                if (tFirstname != null)
                    sqlCmd.Parameters.Add("@FirstName", SqlDbType.VarChar).Value = tFirstname.Text;
                if (tLastname != null)
                    sqlCmd.Parameters.Add("@Lastname", SqlDbType.VarChar).Value = tLastname.Text;
                if (tAddress != null)
                    sqlCmd.Parameters.Add("@Address", SqlDbType.VarChar).Value = tAddress.Text;
                sqlCmd.ExecuteNonQuery();
            }

【讨论】:

  • 你的txtData是什么???当你给出答案时,不要在你的代码中出错。
  • @ Khazratbek:那是错误的;感谢您指出,我已经更新了答案。
猜你喜欢
  • 1970-01-01
  • 2012-01-20
  • 1970-01-01
  • 2017-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-05
  • 1970-01-01
相关资源
最近更新 更多