当转发器在回发时绑定到数据表时,无法检索转发器内的文本框的值

时间:2014-05-29 22:32:59

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

我有一个绑定到数据表的转发器,但转发器的最后一列有一个文本框(不是以编程方式创建的)。我有一个按钮,但外面的中继器。在button_click事件中,我想获取在文本框中输入的值以及转发器的该行中的数据。在回发期间/期间,数据表再次重新创建并绑定到转发器,但在button_click事件中,文本框为空(假设用户输入了值并单击按钮)。我已经完成了重新绑定,我在Google上搜索时获得了大部分答案。我不确定数据表到转发器的数据绑定是否会影响文本框列,因为该列不是数据表的一部分?我该怎么做呢?请参阅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

2 个答案:

答案 0 :(得分:0)

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

首先,您需要确保在回发页面上绑定Repeater控件一次,以确保在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语句中比较它之前检查文本框值是否为整数,那就好了。

如果您在使用此代码时遇到问题,请与我们联系。

答案 1 :(得分:0)

我能说的是,文本框值一直都在回发上。这是我的程序逻辑让我无法看到它。虽然这不是我非常确定我的问题的最佳解决方案,但无论如何,它的工作原理。 首先,我所做的是在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)。我已经了解到,我无法使用通用功能或事件,我可以从文本框中获取值,同时也可以获得dataitem值。

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

好吧那就是伙计们,我希望有一天这也能帮助别人。