Member 8583441 Ответов: 2

Указанный аргумент находился вне диапазона допустимых значений. Имя параметра: индекс


Я творю asp.net веб-приложение в visual studio 2017. В aspx-страницы, я отдал аjaxcontroltoolkit для создания вкладки контейнера. Панель вкладок будет создана динамически. Эту панель мы получаем из DataSet C# Asp.net и контент привязан к gridview, все настроено нормально. Под содержимым вкладки есть asp.net кнопка это событие onclick запускается вчера, когда я создал вчера перед созданием контейнера вкладок. Теперь проблема в том, когда я нажимаю кнопку asp.net кнопка получения ошибки, как указано ниже. Может ли кто-нибудь объяснить мне, как избавиться от этой ошибки. Заранее спасибо

Server Error in '/' Application.
Specified argument was out of the range of valid values.
Parameter name: index
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values.
Parameter name: index

Source Error:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace:


[ArgumentOutOfRangeException: Specified argument was out of the range of valid values.
Parameter name: index]
   System.Web.UI.ControlCollection.get_Item(Int32 index) +9822693
   AjaxControlToolkit.TabPanelCollection.get_Item(Int32 index) +61
   AjaxControlToolkit.TabContainer.LoadClientState(String clientState) +305
   AjaxControlToolkit.ScriptControlBase.LoadPostData(String postDataKey, NameValueCollection postCollection) +176
   AjaxControlToolkit.TabContainer.LoadPostData(String postDataKey, NameValueCollection postCollection) +105
   AjaxControlToolkit.ScriptControlBase.System.Web.UI.IPostBackDataHandler.LoadPostData(String postDataKey, NameValueCollection postCollection) +69
   System.Web.UI.Page.ProcessPostData(NameValueCollection postData, Boolean fBeforeLoad) +758
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1833


Что я уже пробовал:

<div style="margin-bottom: 434px">
    <asp:UpdatePanel ID="upTabContainer" runat="server">
        <ContentTemplate>
            <cc1:TabContainer ID="SubjectCategoryTabs" runat="server"                                  Visible="true">
            </cc1:TabContainer>
        </ContentTemplate>
    </asp:UpdatePanel>
</div>

2 Ответов

Рейтинг:
2

OriginalGriff

Вы пытаетесь получить доступ к массиву или списку и указываете значение индекса, которое либо отрицательно, либо больше, чем самый большой доступный индекс. Например, если у вас есть три элемента в массиве или списке, то индексы 0, 1 и 2 допустимы, но любое другое значение вообще вызовет исключение.

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

Мы не можем сделать ничего из этого для вас: у нас нет доступа к вашему сайту, вашему коду или вашим данным!


Member 8583441

Я публикую свой код, Пожалуйста, помогите мне. И во-вторых, мне нужно иметь выбранное значение переключателя в stringbuilder, как я могу этого достичь.
пустота AddTabPanels()
{
SubjectCategoryTabs.Tabs.Четкий();
по каждому элементу (объект DataTable ТБ в ДС.Таблицы)
{
for (int i = 0; i < tb.Rows.Граф; i++)
{
имя строки = tb.Rows[i]["SubjectCategory"].Метод toString();
AjaxControlToolkit.Панель TabPanel = новый AjaxControlToolkit.TabPanel
{
HeaderText = имя.Метод toString()
};
строка sQuestionsAndOptions = BindQuestionsAndChoices(имя);
панель.Управления.Добавить(новый литерал { Text = sQuestionsAndOptions });
SubjectCategoryTabs.Tabs.Add(панель);
}
}
}

private string BindQuestionsAndChoices(строковое значение)
{
StringBuilder htmlTable = новый StringBuilder();
SqlConnection con = новый SqlConnection(DbBridge.Соединение с БД);
пробовать
{
if (con.State == ConnectionState.Закрытый)
против.Открыть();
строка запроса = "выбрать * из QuestionsChoice где тема = '" + сессия["тема"] + "' и SubjectCategory = '" + значение + "' заказ QuestionNumber АСК";
SqlDataAdapter sda = новый SqlDataAdapter(запрос, con);
DataTable dt = новый DataTable();
ПДД.Заполнить(ДТ);
htmlTable.Добавлять("");
если (!объект.Равно(ДТ, нуль))
{
StringBuilder sbQA = новый StringBuilder();
sbQA.Аппендикс(@"");
sbQA.Аппендикс(@"");
sbQA.Аппендикс(@"");
sbQA.Аппендикс(@"");
sbQA.Аппендикс(@"");
sbQA.Аппендикс(@"");
sbQA.Аппендикс(@"");
sbQA.Аппендикс(@"");
sbQA.Аппендикс(@"");
строка aQuestion = sbQA.Метод toString();
если (ДТ.Строк.Count > 0)
{
для (int i = 0; i < dt.строк.Граф; i++)
{
htmlTable.(AQuestion AppendFormat, ДТ.Строки[я]["QuestionNumber"], ДТ.Строки[я]["вопрос"] ДТ.Строки[я]["ChoiceA"], ДТ.Строки[я]["ChoiceB"], ДТ.Строки[я]["ChoiceC"], ДТ.Строки[я]["подобранных"]);
}
htmlTable.Добавить("{0}) {1}&л;тип входного=""радио"" код=""рб1{0}"" название=""параметры{0}"" значение=""собой""и GT; а) &ЛТ;метка для=""рб1{0}""&ГТ;{2} в<тип входного=""радио"" код=""рб2{0}"" название=""параметры{0}"" значение=""Б""и gt; Б) &ЛТ;метка для=""рб2{0}""&ГТ;{3} в<тип входного=""радио"" код=""рб3{0}"" название=""параметры{0}"" значение=""с""&ГТ; с) &ЛТ;метка для=""рб3{0}""&ГТ;{4} в<тип входного=""радио"" код=""rb4{0}"" название=""параметры{0}"" значение=""Д""&ГТ; Д) &ЛТ;метка для=""rb4{0}""&ГТ;{5}");
}
еще
{
htmlTable.Append(@"записей нет.");
htmlTable.Добавлять("");
}
}
}
поймать(исключение бывший)
{
ClientScript.RegisterClientScriptBlock(метод gettype(), "ошибка", "предупреждение('" + экс.Сообщение + "');", правда);
}
наконец
{
if (con.State == ConnectionState.Открыть)
против.Закрывать();
}
верните htmlTable.Метод toString();
}

OriginalGriff

Мы понятия не имеем - мы не можем запустить этот код изолированно и не имеем никакого доступа к данным, стоящим за ним, если бы могли!
Серьезно, это зависит от вас, чтобы собрать информацию - и это означает отладчик или ведение журнала. Без него мы можем сделать даже меньше, чем вы!

Но, пожалуйста, не делай так SQL! Никогда не объединяйте строки для построения команды SQL. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого всегда используйте параметризованные запросы.

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:

SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?
Если вы делали это через весь ваш сайт, вы потеряете свою базу данных - и есть вероятность, что посетителю с расстояния в тысячу километров даже не придется входить в систему, чтобы сделать это...

Рейтинг:
12

Member 8583441

Моя проблема решена с учетом autoeventwireup=false в директиве page. На самом деле по умолчанию это true, когда я устанавливаю его в false, и эта кнопка помещается unside updatepanel с updatemode=condition. Теперь кнопка выглядит хорошо и работает как шарм, что означает, что происходит событие onclick. Это autoeventwireup=false для установки, на которую я ссылался
ASP.NET - отключить свойство autopostback для элемента управления button server.[^]

Спасибо prairiedog sir, что дал мне решение.


Member 8583441

Если я применяю AutoEventWireup="false", то событие щелчка кнопки срабатывает, но серверные элементы управления не видны, как asp.net label, ajax tabcontainer и т. д. Как решить эту проблему. Если я применяю AutoEventWireup="true", то серверные элементы управления видны, но событие нажатия кнопки не срабатывает