Bit2 Developer Ответов: 2

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


Я пытаюсь извлечь все значение строки gridview при нажатии кнопки конкретной строки, но его saya ---
Additional information: Index was out of range. Must be non-negative and less than the size of the collection


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

<asp:GridView ID="gdvCampaign" runat="server" ShowFooter="true" AutoGenerateColumns="false" OnRowCommand="gdvCampaign_RowCommand" class="col-md-12 table-bordered table-striped table-condensed cf" OnRowDeleting="gdvCampaign_RowDeleting">
                                                    <Columns>
                                                        <asp:BoundField DataField="RowNumber" HeaderText="Sl No." />
                                                        <asp:TemplateField HeaderText="Category">
                                                            <ItemTemplate>
                                                                <asp:DropDownList ID="ddlCategory" runat="server" class="form-control" AppendDataBoundItems="true">
                                                                    <asp:ListItem Value="-1">Select</asp:ListItem>
                                                                </asp:DropDownList>
                                                            </ItemTemplate>
                                                            <FooterStyle HorizontalAlign="Center" />
                                                            <FooterTemplate>
                                                                <asp:Button ID="ButtonAdd" runat="server" Text="Add" class="btn btn-info btn-sm" OnClick="ButtonAdd_Click" />
                                                            </FooterTemplate>
                                                        </asp:TemplateField>
                                                        <asp:TemplateField HeaderText="Channel">
                                                            <ItemTemplate>
                                                                <asp:DropDownList ID="ddlChannel" runat="server" class="form-control" AppendDataBoundItems="true">
                                                                    <asp:ListItem Value="-1">Select</asp:ListItem>
                                                                </asp:DropDownList>
                                                            </ItemTemplate>
                                                        </asp:TemplateField>
                                                        <asp:TemplateField HeaderText="Click Action">
                                                            <ItemTemplate>
                                                                <asp:Button ID="btnCollateralPopup" runat="server" CommandArgument='<%#Eval("RowNumber") %>' class="btn btn-info btn-sm" Text="Collateral" />
                                                            </ItemTemplate>
                                                        </asp:TemplateField>
                                                        <asp:CommandField HeaderText="Action Taken" ShowDeleteButton="true" />
                                                    </Columns>
                                                </asp:GridView>




protected void gdvCampaign_RowCommand(object sender, GridViewCommandEventArgs e)
    {
            int rowID = Convert.ToInt32(e.CommandArgument);
    
            campaignModel.tempParentID = rowID;
    
            campaignModel.categoryID = Convert.ToInt32(((DropDownList)gdvCampaign.Rows[rowID].FindControl("ddlCategory")).SelectedValue);  //Error
            campaignModel.categoryName = ((DropDownList)gdvCampaign.Rows[rowID].FindControl("ddlCategory")).SelectedItem.Text;
    
            campaignModel.channelID = Convert.ToInt32(((DropDownList)gdvCampaign.Rows[rowID].FindControl("ddlChannel")).SelectedValue);
    	campaignModel.channelName = ((DropDownList)gdvCampaign.Rows[rowID].FindControl("ddlChannel")).SelectedItem.Text;
           
            dtCampaign.Rows.Add(campaignModel.tempParentID, campaignModel.categoryID, campaignModel.channelID);
    	ViewState["tempCampaignView"] = dtCampaign;
    }

ZurdoDev

Очень просто.

1. Обратите внимание на то, какая строка кода вызвала ошибку.
2. что-то в той строке, к которой вы пытаетесь получить доступ через индекс) не существует. Это все равно что пытаться получить доступ к 10-му элементу в коллекции, состоящей из 5 элементов.

Bit2 Developer

Спасибо, Райан....!
Твоя точка зрения действительно работает на меня.

ZurdoDev

Рад это слышать.

2 Ответов

Рейтинг:
2

OriginalGriff

На первый взгляд - и это все, что может быть-RowID не является индексным значением в gridview - значения ID не всегда (или действительно часто) работают от 0 до n-1, где n-количество значений, потому что хорошая практика означает, что значения ID не используются повторно.

Но мы можем только догадываться, потому что у нас нет доступа к вашим данным, которые являются фундаментальными для поиска проблемы и последующего ее устранения.
Итак, вам предстоит использовать отладчик и выяснить, что именно происходит.
Поместите точку останова в первую строку функции и запустите код через отладчик. Затем посмотрите на свой код и на свои данные и определите, что должно произойти вручную. Затем по одному шагу в каждой строке проверяйте, что именно то, что вы ожидали, произошло. Когда это не так, тогда у вас есть проблема, и вы можете вернуться назад (или запустить ее снова и посмотреть более внимательно), чтобы выяснить, почему.

Извините, но мы не можем сделать это за вас-вам пора освоить новый (и очень, очень полезный) навык: отладку!


Bit2 Developer

Концепция от 0 до (n-1) работает для меня....!
спасибо ('_')

OriginalGriff

Пожалуйста!

Рейтинг:
2

Patrice T

С помощью отладчика вы сможете увидеть значение переменных в позиции ошибки.

Существует инструмент, который позволяет вам видеть, что делает ваш код, его имя-отладчик.
Это отличный инструмент обучения, потому что он показывает вам реальность, и вы можете увидеть, какие ожидания соответствуют реальности.
Когда вы не понимаете, что делает ваш код или почему он делает то, что делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволяет вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения, это невероятный инструмент обучения.

Отладчик-Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010-YouTube[^]
Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.