Как сохранить введенный пользователем текст в TextBox, вложенном в UpdatePanel между обновлениями? - PullRequest
1 голос
/ 15 февраля 2011

У меня есть ASP.Net UpdatePanel, который обновляется по таймеру. Внутри UpdatePanel и вложенных в GridView у меня есть TextBox, в который пользователь вводит значение с помощью кнопки отправки. Все работает нормально, за исключением случаев, когда пользователь не отправляет значение раньше установленного интервала времени, текст удаляется из TextBox.

Есть ли способ сохранить запись пользователя в TextBox между обновлениями? Есть ли лучший способ сделать это?

Все предложения приветствуются.

почтение,

Рэй К. Раган

Код Постскриптум:

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>

Codebehind:

    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 ]

1 голос
/ 15 февраля 2011

Вы перепривязываете DataList каждый раз, когда срабатывает таймер. Все изменения в ItemTemplates из DataList будут потеряны при обратной передаче.

Почему бы не использовать Javascript, чтобы "приостановить" таймер, когда одно из текстовых полей получает фокус. Это предотвратит срабатывание таймера и позволит пользователям заканчивать ввод текста. Как только они покидают текстовое поле «onblur», вы можете перезапустить таймер.

Обновление

Чтобы это произошло, потребуется немного усилий, но вы можете сделать что-то вроде:

  • Когда таймер отправляет обратно, перед повторным связыванием перебирает DataList при поиске текстовых полей с текстом в них. Что-то вроде:

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

  • На данный момент, вы будете знать, какие строки нужно заполнить текстовыми полями. Сохраните эту информацию в хеш-таблице.

В событии DataList ItemDataBound проверьте каждый идентификатор строки по хеш-таблице, чтобы увидеть, существует ли соответствующее текстовое поле. Если это так, снова заполните текстовое поле в строке DataList.

0 голосов
/ 15 февраля 2011

Вы инициализируете значение TextBbox в своем коде, возможно, в Page_Load или другом методе страницы?

TextBox1.Text = "";

Если так, этот код выполняется при каждом событии таймера.Это можно предотвратить следующим образом:

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

Первый запрос, который попадает на страницу ASP.NET, обычно представляет собой запрос HTTP GET , в то время как кнопки ASP.NET и события панели обновления выдают сообщение HTTP POST запросов.Таким образом, приведенный выше код очистит TextBox1 при первом обращении к странице, но оставит значение в покое при получении запросов от самого себя.(Если вы действительно устанавливаете значение текстового поля в значение по умолчанию - пустое - вы можете просто удалить код инициализации.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...