Панель обновления не работает в asp.net

#c# #asp.net #updatepanel

#c# #asp.net #панель обновления

Вопрос:

Я пытаюсь показать онлайн-поезд на своей странице без какого-либо обновления. Поэтому я думаю, что я должен использовать updatepanel . Моя панель должна обновляться каждую секунду.

Позвольте объяснить мой код.

Я поместил эту часть кода на свою страницу:

 <asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
<asp:UpdatePanel ID="UpdatePanel1" runat="server" OnLoad="UpdatePanel1_Load">
    <ContentTemplate>
    </ContentTemplate>
</asp:UpdatePanel>
 

Итак, я установил интервальную функцию для обновления моей панели следующим образом,

 <script type="text/javascript">
    $(function () {
        setInterval("__doPostBack('<%=UpdatePanel1.ClientID%>', '');", 1000);
    });
 

В моем коде я помещаю все извлеченные данные,

 protected void UpdatePanel1_Load(object sender, EventArgs e)
{
    foreach (var t in OnlineTrainList)
    {
        Response.Write("<div id='train-box' style='margin-left:"   (t.XTrainLocation - 8)   "px;margin-top:"   t.YTrainLocation   "px;background:"   t.Train.TrainColor   "'>"  
                           "<span>"  
                                t.TrainId  
                           "</span>"  
                       "</div>");
        List<Sensor> PassedSensor = new List<Sensor>();
        PassedSensor = SensorRepository.FindBy(i => i.CurrentTrainId == t.TrainId).ToList();
        string color = TrainRepository.FindBy(i => i.Id == t.TrainId).First().TrainColor;
        foreach (Sensor sensor in PassedSensor)
        {
            Response.Write("<div class='CurrentColor-Sensor' style='margin-left:"   (sensor.XLocation - 1)   "px;margin-top:"   (sensor.YLocation   8)   "px;background:"   color   "'></div>");
        }
    }
}
 

Итак, моя проблема в том, что панель не обновляется.И моя панель UpdatePanel1_Load просто вызывается один раз.

Комментарии:

1. это потому, что на ваш другой вопрос я сказал вам не использовать Response.Write с панелью обновления 🙂

2. Да, вы правы . Я должен использовать htmlgenerator?

3. ну, ваш код довольно прост, я бы просто закодировал все это в объектном стиле. дай мне секунду, я покажу тебе, как это делается.

Ответ №1:

Итак, ваш код:

 foreach (var t in OnlineTrainList)
{
    Response.Write("<div id='train-box' style='margin-left:"   (t.XTrainLocation - 8)   "px;margin-top:"   t.YTrainLocation   "px;background:"   t.Train.TrainColor   "'>"  
                       "<span>"  
                            t.TrainId  
                       "</span>"  
                   "</div>");
    List<Sensor> PassedSensor = new List<Sensor>();
    PassedSensor = SensorRepository.FindBy(i => i.CurrentTrainId == t.TrainId).ToList();
    string color = TrainRepository.FindBy(i => i.Id == t.TrainId).First().TrainColor;
    foreach (Sensor sensor in PassedSensor)
    {
        Response.Write("<div class='CurrentColor-Sensor' style='margin-left:"   (sensor.XLocation - 1)   "px;margin-top:"   (sensor.YLocation   8)   "px;background:"   color   "'></div>");
    }
}
 

первое, на что я должен обратить ваше внимание id , это то, что вы назначаете всем этим разделам, оно должно быть уникальным и никогда не совпадать. вы можете использовать переменную увеличения и добавить ее к идентификатору вашего div, например: div0, div1... etc

теперь давайте посмотрим на первую строку внутри цикла. то, что он в основном имеет, — это <span> вложенный внутри a <div> и содержащий некоторые атрибуты с текстом.

в Asp.Net способ обработки элементов будет объектно-ориентированным, а не просто html-строкой:

 protected void UpdatePanel1_Load(object sender, EventArgs e)
{
    //clear the update panel
    UpdatePanel1.ContentTemplateContainer.Controls.Clear();
    //var to generate unique div id's 
    int divIDIncrement = 0;
    foreach (var t in OnlineTrainList)
    {
        //increment the id generator 
        divIDIncrement  ;
        // create a a DIV element
        HtmlGenericControl _tempDIV = new HtmlGenericControl("div");
        //set the attributes for the div
        _tempDIV.ID = "train-box"   divIDIncrement.ToString();
        _tempDIV.Style["margin-left"] = (t.XTrainLocation - 8).ToString()   "px";
        _tempDIV.Style["margin-top"] = t.YTrainLocation.ToString()   "px";
        _tempDIV.Style["background"] = t.Train.TrainColor.ToString();
        //create the inner span
        HtmlGenericControl _tempSPAN = new HtmlGenericControl("span");
        //set the span's innerText
        _tempSPAN.InnerText = t.TrainId.ToString();
        //add the span into the Div
        _tempDIV.Controls.Add(_tempSPAN);
        //add the Div into your UpdatePanel
        UpdatePanel1.ContentTemplateContainer.Controls.Add(_tempDIV);


        List<Sensor> PassedSensor = new List<Sensor>();
        PassedSensor = SensorRepository.FindBy(i => i.CurrentTrainId == t.TrainId).ToList();
        string color = TrainRepository.FindBy(i => i.Id == t.TrainId).First().TrainColor;
        foreach (Sensor sensor in PassedSensor)
        {
            // create another div for the sub stuff
            HtmlGenericControl _tempSubDIV = new HtmlGenericControl("div");
            _tempSubDIV.Attributes["class"] = "CurrentColor-Sensor";
            _tempSubDIV.Style["margin-left"] = (sensor.XLocation - 1).ToString()   "px";
            _tempSubDIV.Style["margin-top"] = (sensor.YLocation   8).ToString()   "px";
            _tempSubDIV.Style["background"] = color.ToString();
            //add the sub stuff to the update panel
            UpdatePanel1.ContentTemplateContainer.Controls.Add(_tempSubDIV);
        }
    } 
}
 

Комментарии:

1. Спасибо, я получил эту ошибку: свойство Controls UpdatePanel с идентификатором ‘UpdatePanel1’ не может быть изменено напрямую. Чтобы изменить содержимое панели обновления, измените дочерние элементы управления свойства ContentTemplateContainer

2. Я получил вышеуказанную ошибку в этой строке: Строка 71: _tempDIV.Controls. Добавить(_tempSPAN); Строка 72: //добавьте Div в панель обновлений Строка 73: UpdatePanel1. Элементы управления. Добавить(_tempDIV);

3. да, извините, я виноват, я написал все это вслепую… я должен был UpdatePanel.ContentTemplateContainer.Controls.Add() обновить ответ

4. Спасибо, но теперь я получил ту же ошибку: свойство Controls UpdatePanel с идентификатором ‘UpdatePanel1’ не может быть изменено напрямую. Чтобы изменить содержимое панели обновления, измените дочерние элементы управления свойства ContentTemplateContainer.,в этой строке ://очистите строку 54 панели обновления: UpdatePanel1. Элементы управления. Очистить (); Строка 55: //var для создания уникальных идентификаторов div

5. да, я пропустил это xD, но то же самое происходит и там