【问题标题】:Unable to retrieve the value of textbox inside repeater, when repeater is bound to datatable at postback当转发器在回发时绑定到数据表时,无法检索转发器内的文本框的值
【发布时间】:2014-05-29 22:32:59
【问题描述】:

我有一个绑定到数据表的转发器,但转发器的最后一列有一个文本框(不是以编程方式创建的)。我有一个按钮,但在中继器之外。在 button_click 事件中,我想获取在文本框中输入的值以及中继器该行中的数据。在回发中/在回发期间,数据表再次被重新创建并绑定到转发器,但在 button_click 事件中,文本框为空(假设用户输入了一个值并单击了按钮)。我已经完成了重新绑定,在谷歌搜索时我得到了大部分答案。我不确定数据表到转发器的数据绑定是否会影响文本框列,因为该列不是数据表的一部分?我该怎么做?请查看 HTML 和下面的代码,

HTML

<div id="ucprodres-any-mfg">
        <asp:Repeater ID="rptAnyMfg" runat="server" >
            <ItemTemplate>
                <div id="ucprodres-any-mfg-row">
                    <div class="ucprodres-stock manufacturer">
                        <div class="ucprodres-mfg ">
                            <div id="ucprodres-exp-any-mfg" data-swap="-">+</div>
                            <div>&nbsp;&nbsp;<%#DataBinder.Eval(Container.DataItem, "Mfg")%></div>
                        </div>
                    </div>
                    <div class="ucprodres-stock qty-avail">
                        <%#DataBinder.Eval(Container.DataItem, "Qty")%>
                    </div>
                    <div class="ucprodres-stock availability">
                        <%#DataBinder.Eval(Container.DataItem, "Availability")%>
                    </div>
                    <div class="ucprodres-stock unit-price">
                        <%#DataBinder.Eval(Container.DataItem, "QtyRange")%>
                    </div>
                    <div class="ucprodres-stock dollar">
                        <%#DataBinder.Eval(Container.DataItem, "QtyRangePrice")%>
                    </div>
                    <div id="txtboxID" class="ucprodres-stock qty-required" >
                        <asp:TextBox ID="tbxAnyMfg" runat="server" style="text-align: right"
                            ToolTip="Quantity should not be more than available quantity."></asp:TextBox>
                        <div class="ucprodres-txtbox-info">Quantity should not be more than available quantity</div>
                    </div>
                </div>
            </ItemTemplate>
        </asp:Repeater>
    </div>

隐藏代码

Public Sub Button_Click(sender As Object, e As EventArgs) Handles Button.Click
For Each rptitems As RepeaterItem In rptAnyMfg.Items
        If (rptitems.ItemType = ListItemType.Item) Or (rptitems.ItemType = ListItemType.AlternatingItem) Then
            Dim tbxQtyReqd As TextBox = rptitems.FindControl("tbxAnyMfg")
            If Not String.IsNullOrEmpty(tbxQtyReqd.Text) Then
                If tbxQtyReqd.Text > "0" Then
                    Dim mfg As String = rptitems.DataItem("Mfg").ToString
                    Dim qty As String = rptitems.DataItem("Qty").ToString
                    Dim avail As String = rptitems.DataItem("Availability").ToString
                    Dim qtyrange As String = rptitems.DataItem("QtyRange").ToString
                    Dim unitprice As String = rptitems.DataItem("QtyRangePrice").ToString
                    Dim qtyreqd As String = tbxQtyReqd.Text
                    Dim rfqpart As New Parts.InStock
                    Dim rfqpartdetails As New Parts.InStock.PartsData(mfg, qty, avail, qtyrange, unitprice, qtyreqd)
                    rfqpart.Add(rfqpartdetails)
                End If
            End If
        End If
    Next
End Sub

【问题讨论】:

    标签: asp.net vb.net data-binding datatable postback


    【解决方案1】:

    我不擅长VB语法,所以我把示例放在C#中,你可以自己转换成VB。

    首先,您需要确保在页面回发上绑定您的中继器控件一次,因此请确保您的 Page_load 方法中有此代码:

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
               BindRepeater();
        }
    
    
        void BindRepeater()
        {
            rptAnyMfg.DataSource = GetDataFromDB();
            rptAnyMfg.DataBind();
        }
    

    然后您在您的 Button_Click 事件中检查文本框控件,然后再取消装箱到文本框控件,如下所示:

        protected void Button1_Click(object sender, EventArgs e)
        {
            foreach (RepeaterItem item in rptAnyMfg.Items)
            {
                if (item.ItemType == ListItemType.Item || item.ItemType == ListItemType.AlternatingItem)
                {
                    if ((TextBox)item.FindControl("tbxAnyMfg") != null && 
                        !string.IsNullOrEmpty(((TextBox)item.FindControl("tbxAnyMfg")).Text))
                    {
                        int value;
                        string text = ((TextBox)item.FindControl("tbxAnyMfg")).Text;
    
                        if (!string.IsNullOrEmpty(text) && int.TryParse(text, out value))
                        {
                            if (value > 0)
                            {
                                // your value assignments here
                            }
                        }
                    }
                }
            }
        }
    

    只是为了改进您的代码,最好在 if 语句中比较之前检查文本框的值是否为整数。

    如果您在使用此代码时遇到问题,请告诉我。

    【讨论】:

    • 我确实重新绑定了我的转发器,实际上是在每次回发时,因为我不检查页面是否回发,因为我需要重新创建正在使用的数据表。在 button_click 事件中,我能够找到文本框,但问题是它是空的。你知道为什么它是空的吗?
    【解决方案2】:

    好吧,我可以说,文本框值在回发时始终存在。是我的程序逻辑让我看不到它。虽然这不是我很确定我的问题的最佳解决方案,但无论如何,它奏效了。 首先,我所做的是在 Page_load 事件中(仅)在回发时捕获文本框的值(使用数组列表)。

    Private Sub GetTextBoxValue()
        Dim i As Integer = 0
        For Each rptitem As RepeaterItem In rptAnyMfg.Items
            Dim txtbox As TextBox = rptitem.FindControl("tbxAnyMfg")
            If Not String.IsNullOrEmpty(txtbox.Text) Then
                arrQtyReqd.Add(txtbox.Text)
            End If
        Next
    
    End Sub
    

    其次,使文本框的列成为数据表的一部分,这意味着我在数据表中为文本框值创建了一个列。由于我的程序将重新创建数据表(甚至在回发时),因此在此阶段,我使用 arraylist 中的值更新此列(我用于存储文本框的值,记住 Sub GetTextBoxValue)。我了解到,我无法使用通用函数或事件来从文本框中获取值,同时获取数据项值。

    第三,在 button_click 事件中,我使用数据表来获取我需要的所有值(在文本框中进行更改)而不是中继器。

    好吧,伙计们,我希望有一天这也会对某人有所帮助。

    【讨论】:

      猜你喜欢
      • 2018-11-21
      • 1970-01-01
      • 2012-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多