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

How do I get the textbox value to the database within a 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?

您必须在从预算中获取值的转发器项目模板中放置一个隐藏字段,并在 post 返回请求中放置另一个隐藏字段以保留必须读取的 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" />

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

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

        }
    }

请注意,我的代码缺少最基本的验证,因此如果用户在文本框中写入无效值(例如 "yyy"),它就会中断。所以请不要按原样投入生产!