#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, но то же самое происходит и там