如何在转发器中获取文本框值到数据库?

时间:2015-04-24 21:44:11

标签: c# asp.net sql-server repeater

我有一个从数据库中填充的转发器:

using (SqlConnection conn = new SqlConnection(connString))
{
   SqlCommand cmd = new SqlCommand(@"SELECT CommunityName, CID, Budget FROM Donation WHERE Year = year(getdate()) ORDER BY CommunityName", conn);
   conn.Open();
   SqlDataAdapter adp = new SqlDataAdapter(cmd);
   DataSet myDataSet = new DataSet();
   adp.Fill(myDataSet);
   myRep.ItemDataBound += new RepeaterItemEventHandler(myRep_ItemDataBound);
   myRep.DataSource = myDataSet;
   myRep.DataBind();
}
void myRep_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
   var textbox = e.Item.FindControl("community");
   textbox.ClientIDMode = ClientIDMode.Static;
   textbox.ID = "community" + (e.Item.ItemIndex + 1);
 }

中继器:

<asp:UpdatePanel ID="UpdatePanel" runat="server" UpdateMode="Always">
    <ContentTemplate>
       <asp:Repeater ID="myRep" runat="server">
          <ItemTemplate>
             <div class="form-group">
                <asp:Label ID='thisLbl' runat="server" Text='<%# Eval("CommunityName") %>' />
                <asp:TextBox runat="server" ID="community" Text='<%# Eval("Budget") %>' CssClass="form-control" />
             </div>
          </ItemTemplate>
       </asp:Repeater>
    </ContentTemplate>
</asp:UpdatePanel>

这会创建6个带有标签和值的文本框,现在我的问题是如何检测这些框中哪些属于最初从数据库中提取的记录?我希望能够修改这些框中的值并点击一个按钮将它们保存回数据库,但我似乎无法将它们包裹起来,让它们找到正确的记录。

我应该将文本框的ID设置为可以解析的内容并与正确的记录匹配吗?在ItemDataBound中?

1 个答案:

答案 0 :(得分:1)

您必须在转发器项目模板中放置一个隐藏字段,该字段从预算中获取值,另一个隐藏字段用于保留必须在回发请求中读取的CID值。当然,您还需要一个按钮及其单击事件处理程序。

    <asp:Repeater ID="myRep" runat="server">
      <ItemTemplate>
         <div class="form-group">
            <asp:Label ID='thisLbl' runat="server" Text='<%# Eval("CommunityName") %>' />
            <asp:TextBox runat="server" ID="txtBudget" Text='<%# Eval("Budget") %>' CssClass="form-control" />
            <asp:HiddenField runat="server" ID="hdOriginalBudget" Value='<%# Eval("Budget") %>' />
            <asp:HiddenField runat="server" ID="hdCID" Value='<%# Eval("CID") %>' />
         </div>
      </ItemTemplate>
   </asp:Repeater>
    <br />
    <asp:Button ID="btn" runat="server" OnClick="btn_Click" />

在您的代码中,您需要在转发器内部循环,以通过将其值与隐藏字段进行比较来检查文本框是否已更改。在数据库中保存预算值后,您需要将隐藏字段值重新调整为用户输入的新值,否则您将在每次回发后始终保存该值:

    protected void btn_Click(object sender, EventArgs e)
    {
        foreach (RepeaterItem item  in myRep.Items)
        {
            var txtBudget = item.FindControl("txtBudget") as TextBox;
            var hdOriginalBudget = item.FindControl("hdOriginalBudget") as HiddenField;
            var hdCID = item.FindControl("hdCID") as HiddenField;
            if (txtBudget.Text != hdOriginalBudget.Value)
            { 
                //If you enter here means the user changed the value of the text box

                using (SqlConnection conn = new SqlConnection(connString))
                {
                    SqlCommand cmd = new SqlCommand(@"UPDATE Donation SET Budget = @Budget WHERE CID = @CID", conn);
                    cmd.Parameters.Add(new SqlParameter("@Budget", int.Parse(txtBudget.Text)));
                    cmd.Parameters.Add(new SqlParameter("@CID", int.Parse(hdCID.Value)));
                    conn.Open();
                    cmd.ExecuteNonQuery();
                }

                //After you write in the database realign the values
                hdOriginalBudget.Value = txtBudget.Text; 
            }

        }
    }

请注意我的代码缺少最基本的验证,因此如果用户在文本框中写入无效值(例如&#34; yyy&#34;)则会中断。所以请不要将其投入生产!