Индекс вне диапазона.Не удалось получить selectedIndexChanged в качестве индекса для запроса - PullRequest
0 голосов
/ 22 ноября 2018

Я получаю 'Ошибка индекса вне диапазона', но не знаю почему,

У меня есть главный элемент управления gridview, и я использую SelectedIndexChanged для отображения дополнительной информации о выбранной строке в подробном представлении, однако, когда япопробуйте указать на выбранную строку в запросе, он выдает ошибку индекса вне диапазона.

Я использую модель ADO.NET Entity и хочу по существу получить данные о выбранной строке сетки, используя другую таблицу базы данных с именемEventLog и заполните представление сведений этим.

Сообщение об ошибке (строка 50)

Строка 50: description = Tquery [IntEid] .EventLogs.FirstOrDefault (). EventDesc.ToString ();

Строка 51: resultCode = Convert.ToInt32 (Tquery [IntEid] .EventLogs.FirstOrDefault (). ResultCode);

Вот мой код SelectedIndexChanged:

<!-- language: lang-c# -->
string description;
int resultCode;
int TaskInstanceID;
string Eid;
int IntEid;

//added 's' at end of eventDetailsView due to conflicting naming conventions
DetailsView eventDetailsViews = new DetailsView();

public void tasksGridView_SelectedIndexChanged(Object sender, EventArgs e)
{
    eventDetailsView.Visible = true;
    //Get's the currently selected row
    GridViewRow row = tasksGridView.SelectedRow;
    selectedId = row.Cells[1].Text;
    System.Diagnostics.Debug.WriteLine(selectedId);

    Eid = tasksGridView.SelectedRow.Cells[1].Text;
    IntEid = Convert.ToInt32(Eid);

    description = Tquery[IntEid].EventLogs.FirstOrDefault().EventDesc.ToString();
    *///description = Tquery[IntEid].EventLogs.FirstOrDefault().EventDesc;*
    resultCode = Convert.ToInt32(Tquery[IntEid].EventLogs.FirstOrDefault().ResultCode);
    TaskInstanceID = Convert.ToInt32(Tquery[IntEid].EventLogs.FirstOrDefault().TaskInstanceID);

    DataTable dt = new DataTable();
    dt.Columns.AddRange(new DataColumn[3]
        {
            new DataColumn("Eid", typeof(int)),
            new DataColumn("Description", typeof(string)),
            new DataColumn("TaskInstanceID", typeof(int))
        });
    dt.Rows.Add(Eid, description, TaskInstanceID);

    eventDetailsViews.DataSource = dt;
    eventDetailsView.DataBind();

}

Вот мой код запроса:

    protected void Page_Load(object sender, EventArgs e)
{
    infordevEntitiesOrbis dbContext = new infordevEntitiesOrbis();
    //Acting as a using SqlConnection to the database
    using (infordevEntitiesOrbis context = new infordevEntitiesOrbis())
    {
        //On pageload, not on user interaction (Occurs regardless)
        if (!IsPostBack)
        {
            d = d.AddMonths(-3);

            //Query written using LINQ
            Tquery = (from tasks in context.Tasks.AsEnumerable()
                      select new Task()
                      {
                          TaskID = tasks.TaskID,
                          TaskName = tasks.TaskName,
                          TaskPath = tasks.TaskPath,
                          Schedules = tasks.Schedules
                      }).ToList();

ASP-код для просмотра сетки и подробностей:

 <asp:GridView ID="tasksGridView" runat="server" DataKeyNames="TaskID" BackColor="White" BorderColor="#CCCCCC" BorderStyle="None" BorderWidth="1px" CellPadding="4" ForeColor="Black" GridLines="Horizontal" AutoGenerateColumns="False" AutoGenerateSelectButton="True" OnSelectedIndexChanged="tasksGridView_SelectedIndexChanged" OnSelectedIndexChanging="tasksGridView_SelectedIndexChanging" OnRowDataBound="tasksGridView_RowDataBound1" HorizontalAlign="Center">
                <Columns>
                    <asp:BoundField DataField="TaskID" HeaderText="TaskID" ReadOnly="True" SortExpression="TaskID"></asp:BoundField>
                    <asp:BoundField DataField="TaskPath" HeaderText="TaskPath" SortExpression="TaskPath"></asp:BoundField>
                    <asp:BoundField DataField="TaskName" HeaderText="TaskName" SortExpression="TaskName"></asp:BoundField>
                    <asp:TemplateField HeaderText="RunTime">
                        <ItemTemplate>
                            <asp:TextBox ID="UTCRT" runat="server" Enabled="false" BorderStyle="Dotted" BorderWidth="1px" ReadOnly="True"></asp:TextBox>
                            <asp:TextBox ID="UTCLRT" runat="server" Enabled="false" BorderStyle="Dotted" BorderWidth="1px" ReadOnly="True"></asp:TextBox>
                        </ItemTemplate>
                        <ItemStyle HorizontalAlign="Center" VerticalAlign="Middle" Wrap="True" />
                    </asp:TemplateField>
                </Columns>
                <FooterStyle BackColor="#CCCC99" ForeColor="Black"></FooterStyle>

                <HeaderStyle BackColor="#333333" Font-Bold="True" ForeColor="White"></HeaderStyle>

                <PagerStyle HorizontalAlign="Right" BackColor="White" ForeColor="Black"></PagerStyle>

                <SelectedRowStyle BackColor="#6699FF" Font-Bold="True" ForeColor="White"></SelectedRowStyle>

                <SortedAscendingCellStyle BackColor="#F7F7F7"></SortedAscendingCellStyle>

                <SortedAscendingHeaderStyle BackColor="#4B4B4B"></SortedAscendingHeaderStyle>

                <SortedDescendingCellStyle BackColor="#E5E5E5"></SortedDescendingCellStyle>

                <SortedDescendingHeaderStyle BackColor="#242121"></SortedDescendingHeaderStyle>
            </asp:GridView>


            <asp:DetailsView ID="eventDetailsView" runat="server" AutoGenerateRows="False">
                <RowStyle HorizontalAlign="Center" />
            </asp:DetailsView>

RowDataBound:

foreach (GridViewRow row in tasksGridView.Rows)
    {
        currentDataIndex = e.Row.RowIndex;
        if (row.RowType == DataControlRowType.DataRow)
        {
            if (utcRnTime != null)
            {
                try
                {
                    utcLRTUpdate = Tquery[currentDataIndex].Schedules.FirstOrDefault().UtcLastRunTime.Value;
                    utcRTUpdate = Tquery[currentDataIndex].Schedules.FirstOrDefault().UtcRunTime.Value;

Любая помощьбудет оценено!Я не думаю, что больше требуется код.

Ответы [ 3 ]

0 голосов
/ 23 ноября 2018

Похоже, вы пытаетесь найти задачу в списке по ее идентификатору (я предполагаю, что Eid и IntEid совпадают с Task.TaskID, но по вашему коду это трудно определить).Вы не можете сделать это со списком и свойством [], которое идет по индексу, а не по идентификатору.

Возможно, вам следует вместо этого использовать словарь:

Tquery = (
             from tasks in context.Tasks.AsEnumerable()
             select new Task()
             {
                 TaskID = tasks.TaskID,
                 TaskName = tasks.TaskName,
                 TaskPath = tasks.TaskPath,
                 Schedules = tasks.Schedules
             }
         )
         .ToDictionary
         (
             task => task.TaskID //Create a dictionary using the TaskID as the key
         );

Тогдакогда вы сделаете это:

description = Tquery[IntEid].EventLogs.FirstOrDefault().EventDesc.ToString();

... вы на самом деле будете искать по индексу, а не по индексу.

0 голосов
/ 08 января 2019

Я решил эту проблему, создав отдельный запрос для таблицы EventLogs и используя результаты запроса для выделения переменных 'description', 'resultCode' и 'TaskInstanceID'.

Как видите, новый запрос почтиидентичен старому:

Equery = (from eventLog in context.EventLogs.AsEnumerable()
                  where eventLog.TaskID == IntEid && eventLog.ResultCode != 0 && eventLog.EventType == 2
                  select new EventLog()
                  {
                      TaskID = eventLog.TaskID,
                      EventDesc = eventLog.EventDesc,
                      ResultCode = eventLog.ResultCode,
                      TaskInstanceID = eventLog.TaskInstanceID
                  }).ToList();

Затем задайте результаты запроса здесь:

        description = Equery.FirstOrDefault(t => t.TaskID == IntEid).EventDesc.ToString();
        resultCode = Equery.FirstOrDefault(t => t.TaskID == IntEid).ResultCode.ToString();
        TaskInstanceID = Equery.FirstOrDefault(t => t.TaskID == IntEid).TaskInstanceID.ToString();
0 голосов
/ 22 ноября 2018

Кажется, что вы пытаетесь получить доступ к объекту в списке TQuery по index Eid, который может не существовать (если идентификатор скажет 13020, он будет смотреть на эту позицию в списке),Используйте Tquery.First(t => t.TaskID === Eid).EventLogs..., чтобы получить задачу, которую вы ищете.

...