DataGrid OnItemDataBound вмешивается в событие DropDownList OnSelectedIndexChange - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть веб-страница ASP.Net 4.6.1 с DataGrid.Внутри DataGrid в TemplateColumn у меня есть DropDownList.DropDownList имеет обработчик события OnSelectedIndexChanged:

<asp:DataGrid runat="server" ID="dgPartnerApprovalPending" DataKeyField="OrderID" 
                       CellPadding="10" CellSpacing="10" AlternatingItemStyle-BackColor="WhiteSmoke" HeaderStyle-BackColor="WhiteSmoke" AutoGenerateColumns="false" 
                        AllowSorting="true" OnSortCommand="dgPartnerApprovalPending_SortCommand">
                        <Columns>
                            <asp:BoundColumn DataField="AttorneyName" HeaderText="Attorney Name" SortExpression="AttorneyName" />
                            <asp:BoundColumn DataField="Title" HeaderText="Title" SortExpression="Title" />
                            <asp:BoundColumn DataField="Description" HeaderText="Description" SortExpression="Description" />
                            <asp:BoundColumn DataField="RequestDate" HeaderText="Request Date" SortExpression="RequestDate" />
                            <asp:BoundColumn DataField="TotalAmount" HeaderText="Total Amount" SortExpression="TotalAmount" />
                            <asp:BoundColumn DataField="OrderStatus" HeaderText="Order Status" SortExpression="OrderStatus" />
                            <asp:TemplateColumn HeaderText="Status">
                                <ItemTemplate>
                                    <asp:DropDownList runat="server" ID="ddlStatus" OnSelectedIndexChanged="ddlStatus_SelectedIndexChanged" AutoPostBack="true" 
                                        DataSourceID="sdsStatuses" DataTextField="OrderStatus" DataValueField="OrderStatusID" /> 
                                </ItemTemplate>
                            </asp:TemplateColumn>
                            <asp:BoundColumn DataField="OrderID" HeaderText="Order ID" SortExpression="OrderID" />
                            <asp:HyperLinkColumn Text="Files" DataNavigateUrlField="OrderID" DataNavigateUrlFormatString="~/Files/{0}" />
                        </Columns>
                    </asp:DataGrid>

Обработчик события OnSelectedIndexChanged работает нормально, пока я не добавляю обработчик события OnItemDataBound в DataGrid:

<asp:DataGrid runat="server" ID="dgPartnerApprovalPending" DataKeyField="OrderID" OnItemDataBound="dgPartnerApprovalPending_ItemDataBound" 
                       CellPadding="10" CellSpacing="10" AlternatingItemStyle-BackColor="WhiteSmoke" HeaderStyle-BackColor="WhiteSmoke" AutoGenerateColumns="false" 
                        AllowSorting="true" OnSortCommand="dgPartnerApprovalPending_SortCommand">
                        <Columns>
                            <asp:BoundColumn DataField="AttorneyName" HeaderText="Attorney Name" SortExpression="AttorneyName" />
                            <asp:BoundColumn DataField="Title" HeaderText="Title" SortExpression="Title" />
                            <asp:BoundColumn DataField="Description" HeaderText="Description" SortExpression="Description" />
                            <asp:BoundColumn DataField="RequestDate" HeaderText="Request Date" SortExpression="RequestDate" />
                            <asp:BoundColumn DataField="TotalAmount" HeaderText="Total Amount" SortExpression="TotalAmount" />
                            <asp:BoundColumn DataField="OrderStatus" HeaderText="Order Status" SortExpression="OrderStatus" />
                            <asp:TemplateColumn HeaderText="Status">
                                <ItemTemplate>
                                    <asp:DropDownList runat="server" ID="ddlStatus" OnSelectedIndexChanged="ddlStatus_SelectedIndexChanged" AutoPostBack="true" 
                                        DataSourceID="sdsStatuses" DataTextField="OrderStatus" DataValueField="OrderStatusID" /> 
                                </ItemTemplate>
                            </asp:TemplateColumn>
                            <asp:BoundColumn DataField="OrderID" HeaderText="Order ID" SortExpression="OrderID" />
                            <asp:HyperLinkColumn Text="Files" DataNavigateUrlField="OrderID" DataNavigateUrlFormatString="~/Files/{0}" />
                        </Columns>
                    </asp:DataGrid>

И вот код, который вызывается присобытие ItemDataBound срабатывает:

protected void dgPartnerApprovalPending_ItemDataBound(object sender, DataGridItemEventArgs e)
    {
        ListItemType itemType = (ListItemType)e.Item.ItemType;           

        if (itemType == ListItemType.Item || itemType == ListItemType.AlternatingItem)
        {
            DataRowView view = (DataRowView)e.Item.DataItem;
            string OrderID = view["OrderID"].ToString();

            for (int i = 0; i <= 6; i++)
            {
                e.Item.Cells[i].Attributes.Add("OnClick", "window.location.href='PartnerApprovalDetail.aspx?oid="
                + OrderID
                + "'"
                );
            }
        }
    }

Короче говоря, событие ItemDataBound делает каждую строку доступной для щелчка и перенаправляет пользователя на другую страницу.Как только я добавляю этот обработчик событий и загружаю страницу, всякий раз, когда я нажимаю на DropDownList в любой строке, страница становится пустой.Если я делаю это в отладчике, событие SelectedIndexChanged никогда не запускается.Я попытался связать данные с DropDownList в обработчике OnItemDataBound после того, как строки стали активными.Я также пытался связать данные с DropDownList в PageLoad () после PostBack.Ни то, ни другое не помогает.Как мне обойти это?

1 Ответ

1 голос
/ 03 апреля 2019

Вы добавляете обработчик события onclick в ячейку таблицы <td>, и внутри ячейки таблицы отображается раскрывающийся список. Так, при попытке щелкнуть раскрывающийся список событие click попадает в обработчик событий, определенный в ячейке родительской таблицы. уровень, который увлекает пользователя прочь

Вы можете создать новый столбец шаблона для рендеринга ссылки Подробности:

    <asp:TemplateColumn HeaderText="Status">
       <ItemTemplate>
          <asp:HyperLink ID="DetailsUrls" runat="server" href="PartnerApprovalDetail.aspx?oid=<%#Eval("OrderID")%>">Detail</asp:HyperLink>
      </ItemTemplate>
    </asp:TemplateColumn>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...