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

У меня есть код в приложении 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 &quot;New&quot; to &quot;Existing&quot; (uncheck any that should remain &quot;New&quot;)</asp:TextBox>

    </div>
        <asp:Panel ID="Panel1" runat="server" Height="582px">
        </asp:Panel>
        <asp:Button ID="Button1" runat="server" Text="Update checked to &quot;Existing&quot;" 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").


person B. Clay Shannon    schedule 17.03.2017    source источник
comment
Просто примечание о режиме документа 7, посмотрите на свой тип документа. Возможно, браузер не поддерживает ваш код.   -  person nocturns2    schedule 20.03.2017
comment
Я не знаю, как смотреть на тип документа (я не знаю, что вы имеете в виду). Но теперь код работает, так что я не думаю, что это действительно проблема...   -  person B. Clay Shannon    schedule 20.03.2017
comment
Вы новичок в Visual Studio? Похоже, вы изо всех сил пытаетесь получить текст, который хотите использовать для флажков. Для начала, пробовали ли вы fofik?: 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
comment
Обычные возможности отладки недоступны для меня в этом проекте.   -  person B. Clay Shannon    schedule 20.03.2017


Ответы (2)


В вашем цикле вы пишете строки дважды. Если у вас есть 1000 строк, это приводит к созданию элементов управления 1M. Это может быть проблемой.

Ниже я изменил второй цикл, чтобы перебирать столбцы.

Кроме того, вы можете изменить coName.Text, как показано ниже.

For i As Integer = 0 To categoryDT.Rows.Count - 1
        For j As Integer = 0 To categoryDT.Columns.Count - 1
            Dim coName = New Label()
            coName.Text = categoryDT.Rows(i)(j).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
person fofik    schedule 20.03.2017
comment
Вы, кажется, просто копируете мой код; какой фиксированный код? - person B. Clay Shannon; 20.03.2017
comment
Для j As Integer = 0 To categoryDT.Columns.Count - person fofik; 20.03.2017
comment
Проверьте также значение coName.Text. - person fofik; 20.03.2017
comment
Любой шанс, что: For j As Integer = 0 To (categoryDT.Columns.Count - 1); аналогично: For i As Integer = 0 To (categoryDT.Rows.Count - 1)? т.е. for(int j=0; j<n; ++j) ==› For j As Integer = 0 To (n-1) - person rskar; 20.03.2017

Для полного решения вот каким должен быть код, используя руководство fofik, чтобы получить то, что мне нужно на странице, и все флажки отмечены по умолчанию:

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)

    For i As Integer = 0 To categoryDT.Rows.Count-1
        Dim coName = New Label()
        coName.Text = categoryDT.Rows(i)(0).ToString()
        formCustCatMaint.Controls.Add(coName)
        Dim chk = New CheckBox()
        chk.ID = "chk." + i.ToString()
        chk.Checked = True
        formCustCatMaint.Controls.Add(chk)
        ' Add a "line break" after each checkbox
        Dim l = New Label()
        l.Text = "<br>"
        formCustCatMaint.Controls.Add(l)
    Next

    sqlDAL.Dispose()
End Sub
person B. Clay Shannon    schedule 20.03.2017