У меня есть код в приложении ASP.NET WebForms, в обработчике Page_Load, который не только не делает то, что я хочу (на данный момент покажите кучу флажков с соответствующей меткой, которые просто говорят «что-то» ), но также приводит к тому, что страница не отображается, и даже приводит к тому, что мышь перестает отвечать на запросы, пока я не убью экземпляр браузера и не открою случайные окна для загрузки - проводник Windows, затем обозреватель сервера Visual Studio (который я не открылся довольно давно).
Когда я открываю страницу с закомментированным кодом события, страница отображается, но даже тогда (это может быть подсказкой, я не знаю), когда я нажимаю F12, на вкладке «Консоль» написано: «Прикрепленная страница предназначена для режима документа 7». . Некоторые консольные API и функции могут быть недоступны». Такое же сообщение появляется в верхней части вкладки «Отладчик».
Я не знаю, безобиден ли этот «режим документа 7» или просто странен, или что-то еще.
Вот код, который, кажется, сеет хаос; это содержимое всего файла .aspx.vb:
Imports System.Data
Imports DAL05.DataAccess
Partial Class pages_custmaint_categoryadmin
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) 'Handles Me.Load
Dim sqlDAL As New SQLServer(ConfigurationSettings.AppSettings("ConnectionString"))
Dim sql As String
Dim retDS As DataSet
Dim categoryDT As DataTable
sql = "select C.CompanyName from CustomerCategoryLog CCL join Customers C on C.CustNo = CCL.Custno where CCL.Category = 'New' and C.Active <> 0 order by C.CompanyName"
retDS = sqlDAL.runSQLDataSet(sql)
categoryDT = retDS.Tables(0)
'CategoryDDL.DataSource = categoryDT
'CategoryDDL.DataTextField = "Category"
'CategoryDDL.DataBind()
For i As Integer = 0 To categoryDT.Rows.Count
For j As Integer = 0 To categoryDT.Rows.Count
Dim coName = New Label()
coName.Text = "something" 'categoryDT.Rows[i].ToString()
formCustCatMaint.Controls.Add(coName)
Dim chk = New CheckBox()
chk.ID = "chk." + i.ToString() + "." + j.ToString()
formCustCatMaint.Controls.Add(chk)
Next
Dim l = New Label()
l.Text = "<br>"
formCustCatMaint.Controls.Add(l)
Next
sqlDAL.Dispose()
End Sub
End Class
Соответствующая страница .aspx выглядит просто так:
<%@ Page Language="VB" AutoEventWireup="true" CodeFile="custmaint_categoryadmin.aspx.vb" Inherits="pages_custmaint_categoryadmin" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Customer Category Maintenance</title>
</head>
<body>
<form id="formCustCatMaint" runat="server">
<div>
<asp:TextBox ID="TextBox1" runat="server" Width="675px">Move the following from "New" to "Existing" (uncheck any that should remain "New")</asp:TextBox>
</div>
<asp:Panel ID="Panel1" runat="server" Height="582px">
</asp:Panel>
<asp:Button ID="Button1" runat="server" Text="Update checked to "Existing"" Width="216px" />
</form>
</body>
</html>
Если весь код в событии Page_Load закомментирован, странного поведения не будет (за исключением сообщения «режим 7»). Что в приведенном выше коде может вызвать такой беспредел?
Я получил этот базовый код для динамического создания флажков из принятого решения здесь и прогнал его через конвертер Telerik C# в VB.NET здесь и поэтому адаптировал его к моим потребностям, как показано выше.
Из запроса возвращается много строк (тысячи), но я бы не подумал, что этого недостаточно, чтобы вызвать такую проблему.
ОБНОВИТЬ
Событие запускается, потому что после комментирования всего остального кода я добавил это, чтобы проверить его:
TextBox1.Text = "whatever"
... и это работает - текст TextBox1 меняется на "что угодно"
Значит что-то не так с кодом запроса. Что, однако?
ОБНОВЛЕНИЕ 2
Я собираюсь проверить это маленькими шажками; Я сократил код до этого:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim sqlDAL As New SQLServer(ConfigurationSettings.AppSettings("ConnectionString"))
Dim sql As String
Dim retDS As DataSet
Dim categoryDT As DataTable
sql = "select distinct CompanyName from Customers"
retDS = sqlDAL.runSQLDataSet(sql)
categoryDT = retDS.Tables(0)
sqlDAL.Dispose()
End Sub
... и страница загружается; конечно, он не показывает никаких данных, но я буду продолжать добавлять его, чтобы увидеть, где происходит сбой. Запрос слишком сложный? Проблема в логике цикла? Или что/где?
ОБНОВЛЕНИЕ 3
Затем между назначением DataTable и sqlDAL.Dispose я добавил это:
For i As Integer = 0 To 5 'categoryDT.Rows.Count
For j As Integer = 0 To 3 'categoryDT.Rows.Count
Dim coName = New Label()
coName.Text = "something" 'categoryDT.Rows[i].ToString()
formCustCatMaint.Controls.Add(coName)
Dim chk = New CheckBox()
chk.AutoPostBack = True
chk.ID = "chk." + i.ToString() + "." + j.ToString()
formCustCatMaint.Controls.Add(chk)
Next
Dim l = New Label()
l.Text = "<br>"
formCustCatMaint.Controls.Add(l)
Next
... то же, что и раньше, но с жестко запрограммированными небольшими значениями, а не строками DataTable, которые считаются ограничениями цикла.
Это вроде работает, после моды:
Уродливая мода, по общему признанию, но она помогает мне увидеть, что проблема должна быть с категорией DT.Rows.Count...
Поэтому я восстановил настоящую строку запроса, закомментировал тестовую и добавил следующее:
TextBox1.Text = categoryDT.Rows.Count.ToString()
...и видим, что значение равно 26 821. Может быть, в этом проблема - слишком много данных для обработки... много флажков....
ОБНОВЛЕНИЕ 4
Набор результатов имеет только один столбец, так как он возвращает только одно значение, поэтому я смог упростить код цикла до этого:
For i As Integer = 0 To categoryDT.Rows.Count
Dim coName = New Label()
coName.Text = "something"
formCustCatMaint.Controls.Add(coName)
Dim chk = New CheckBox()
chk.ID = "chk." + i.ToString() '+ "." + i.ToString()
formCustCatMaint.Controls.Add(chk)
Next
Конечно, «что-то» в качестве метки для каждого флажка не совсем подходит; Следующая задача — выяснить, как получить значение из набора результатов/таблицы. categoryDT.Rows[i] не так; categoryDT.Rows[i] Как String это не так...
ОБНОВЛЕНИЕ 5
Я попробовал этот код, чтобы получить результаты из таблицы:
For i As Integer = 0 To categoryDT.Rows.Count-1
Dim coName = New Label()
categoryDT.Rows(i).ToString()
formCustCatMaint.Controls.Add(coName)
Dim chk = New CheckBox()
chk.ID = "chk." + i.ToString() '+ "." + i.ToString()
formCustCatMaint.Controls.Add(chk)
Next
... но я просто получаю флажки beaucoup с той же меткой ("System.Data.DataRow").
coName.Text = categoryDT.Rows(i)(j).ToString()
Кроме того, знакомы ли вы с функцией QuickWatch в Visual Studio (msdn.microsoft.com/en-us/library/0taedcee.aspx)? Поставьте точку останова внутри цикла, а затем используйте QuickWatch для проверки. - person rskar   schedule 20.03.2017