如何在更新之间嵌套在UpdatePanel中的TextBox中维护用户输入的文本?

时间:2011-02-15 14:34:46

标签: asp.net updatepanel

我有一个更新计时器的ASP.Net UpdatePanel。在UpdatePanel中并嵌套在GridView中,我有一个TextBox,用户使用提交按钮输入值。一切正常,除非用户在定时间隔之前没有提交值,否则文本将从TextBox中删除。

有没有办法在更新之间保持用户进入TextBox?有没有更好的方法呢?

欢迎所有建议。

此致,

Ray K. Ragan

代码后记:

ASPX:

<script type="text/javascript">
    var prm = Sys.WebForms.PageRequestManager.getInstance();

    prm.add_beginRequest(beginRequest);

    function beginRequest() {
        prm._scrollPosition = null;
    } 
</script> 

<asp:Timer ID="Timer1" runat="server" Interval="900" OnTick="Timer1_Tick"></asp:Timer>

<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
    <Triggers>
    <asp:AsyncPostBackTrigger ControlID="Timer1" EventName="Tick" />
    </Triggers>
    <ContentTemplate>
    <asp:DataList RepeatColumns="5" RepeatDirection="Horizontal"  ID="dlMine" runat="server" OnItemCommand="Item_Command">
        <ItemTemplate>
            <div style="border:1px solid black;margin:3px;height:300px;text-align:center;padding:5px;">
                <div style="width:150px;">
                <asp:Label ID="lblTitle" runat="server" Text='<%# left(DataBinder.Eval(Container.DataItem,"title").ToString(), 75) %>'></asp:Label>
                </div>   
                    <asp:Label ID="Label1" runat="server" Text='<%# (DateTime)DataBinder.Eval(Container.DataItem,"end_date") %>'></asp:Label>
                    <br />
                    <asp:Label ID="Label2" runat="server" Text='<%# String.Format("{0:C}",DataBinder.Eval(Container.DataItem,"current_value")) %>'></asp:Label>
                    <br />

                    <asp:TextBox ID="txtNewValue" runat="server"></asp:TextBox>

                    <asp:Button Visible='<%# (isInThePast((DateTime)DataBinder.Eval(Container.DataItem,"end_date"))) ? false : true %>' CssClass="bid_button" runat="server" CommandArgument='<%# Eval("ID") %>' CommandName="Revalue" ID="btnBid" Text="Submit New Valuation" />                  
                </div>
        </ItemTemplate>
    </asp:DataList>
    </ContentTemplate>    
    </asp:UpdatePanel>

代码隐藏:

    protected void Page_Load(object sender, EventArgs e)
            {
                Timer1.Tick += new EventHandler<EventArgs>(Timer1_Tick);


                if (!IsPostBack)
                {
                    dataBindList();
                }
            }

            protected void dataBindList()
            {
                if (Request.QueryString["GroupID"] != null)//Are they coming here with a URL var? If so, build content object
                {
                    List<Item> itemList = ItemManager.getItemsByGroupID(Request.QueryString["GroupID"].ToString());

                    dlMine.DataSource = itemList.Take(15);
                    dlMine.DataBind();
                }
            }

            protected void Timer1_Tick(object sender, EventArgs e)
            {
                dataBindList();
                UpdatePanel1.Update();
            }

protected void Item_Command(Object sender, DataListCommandEventArgs e)
        {
            if (e.CommandName == "Revalue")
            {
                Person p = (Person)Session["Person"];

                foreach (DataListItem item in dlMine.Items)
                {


                    string textBoxText = ((TextBox)item.FindControl("txtNewValue")).Text;

                    Utilities.writeLog("txtNewValue: " + textBoxText, 1);

                }            


                dataBindList();
                UpdatePanel1.Update();
            }
        }

2 个答案:

答案 0 :(得分:1)

每次定时器滴答时,您都会重新绑定DataList。 DataList的ItemTemplates中的所有更改都将在回发时丢失。

当其中一个文本框获得焦点时,为什么不使用Javascript“暂停”计时器。这将阻止Timer触发并让用户完成输入文本。一旦他们离开“onblur”的文本框,您就可以重新启动计时器。

<强>更新

以下内容需要付出一些努力才能实现,但您可以执行以下操作:

  • 当定时器回发时,在重新绑定之前,迭代DataList,同时搜索其中包含文本的文本框。类似的东西:

foreach (DataListItem item in dlMine.Items) { //find the textbox control and check for text }

  • 此时,您将知道哪些行需要重新填充文本框。将此信息存储在哈希表中。

在DataList ItemDataBound事件中,针对哈希表检查每个rowID,以查看其对应的文本框是否存在。如果是这样,请重新填充DataList行中的文本框。

答案 1 :(得分:0)

您是在初始化代码隐藏中的TextBbox值,可能是Page_Load还是其他页面方法?

TextBox1.Text = "";

如果是,则该代码在每个计时器事件上执行。你可以这样阻止:

if (! IsPostback) {
    TextBox1.Text = "";
}

第一个命中ASP.NET页面的请求通常是HTTP GET请求,而ASP.NET按钮和更新面板事件会发出HTTP POST个请求。因此,上面的代码将在您第一次访问页面时清除TextBox1,但在接收来自自身的请求时保留值。 (如果您确实将文本框的值设置为默认值 - 为空 - 您可以删除初始化代码。)