ASP.NET: получение данных из выбранного элемента gridview - источник данных linq-to-entity

У меня есть страница asp.net с кодом программной части С #. У меня есть событие, которое запускается в C #, когда выбранный индекс в gridview изменяется ... Этот gridview привязан к entites-data-source, и мне нужно найти способ сообщить моему коду идентификатор объекта который был выбран при вызове метода selected_index_changed (). Есть мысли, как это лучше сделать?

Текущий код обработчика событий:

protected void VehiclesGridView_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (ChangeAttemptedId && !IsSavedId)
            {
                Alert.Show("Dispatch assignment saved... (But you forgot to click Confirm or Cancel!)");
            }
            IsSavedId = false;
            ChangeAttemptedId = true;
            int selectedIndex = VehiclesGridView.SelectedIndex + 1;
            getNextRide(selectedIndex); //TODO: FIX 
        }

Код ASP.NET:

<asp:EntityDataSource ID="VehiclesEDS" runat="server" EnableDelete="True" 
        EnableFlattening="False" EnableInsert="True" EnableUpdate="True" 
        EntitySetName="Vehicles" ContextTypeName="RamRideOps.RamRideOpsEntities" >
    </asp:EntityDataSource>

<asp:UpdatePanel ID="SelectCarUP" runat="server" UpdateMode="Conditional">
        <ContentTemplate>
            <asp:GridView ID="VehiclesGridView" runat="server" AllowPaging="True" 
                AllowSorting="True" DataSourceID="VehiclesEDS" AutoGenerateColumns="False" 
                onselectedindexchanged="VehiclesGridView_SelectedIndexChanged" 
                BackColor="White" BorderColor="#999999" BorderStyle="None" BorderWidth="1px" 
                CellPadding="3" GridLines="Vertical" ShowHeaderWhenEmpty="True" AutoPostBack="True">
                <AlternatingRowStyle BackColor="#DCDCDC" />
                <Columns>
                    <asp:TemplateField ShowHeader="False">
                        <ItemTemplate>
                            <asp:LinkButton ID="GVSelectButton" runat="server" CausesValidation="False" 
                                CommandName="Select" Text="Select"></asp:LinkButton>
                        </ItemTemplate>
                    </asp:TemplateField>
                    <asp:BoundField DataField="CarNum" HeaderText="Car" ReadOnly="True" 
                        SortExpression="CarNum" />
                    <asp:BoundField DataField="CurrPassengers" HeaderText="Passengers" 
                        ReadOnly="True" SortExpression="CurrPassengers" />
                    <asp:BoundField DataField="MaxPassengers" HeaderText="Capacity" ReadOnly="True" 
                        SortExpression="MaxPassengers" />
                    <asp:BoundField DataField="Status" HeaderText="Status" ReadOnly="True" 
                        SortExpression="Status" />
                    <asp:BoundField DataField="StartAdd" HeaderText="Pick-Up Address" 
                        ReadOnly="True" SortExpression="StartAdd" />
                    <asp:BoundField DataField="EndAdd" HeaderText="Drop-Off Address" 
                        ReadOnly="True" SortExpression="EndAdd" />
                    <asp:BoundField DataField="AvgRideTime" HeaderText="Avg. Ride Time" 
                        ReadOnly="True" SortExpression="AvgRideTime" />
                </Columns>
                <FooterStyle BackColor="#CCCCCC" ForeColor="Black" />
                <HeaderStyle BackColor="#004812" Font-Bold="True" ForeColor="White" />
                <PagerStyle BackColor="#999999" ForeColor="Black" HorizontalAlign="Center" />
                <RowStyle BackColor="#EEEEEE" ForeColor="Black" />
                <SelectedRowStyle BackColor="#C6940D" Font-Bold="True" ForeColor="White" />
                <SortedAscendingCellStyle BackColor="#F1F1F1" />
                <SortedAscendingHeaderStyle BackColor="#C6940D" />
                <SortedDescendingCellStyle BackColor="#CAC9C9" />
                <SortedDescendingHeaderStyle BackColor="#9F770B" />
            </asp:GridView>
        </ContentTemplate>
    </asp:UpdatePanel>

Ошибка при изменении EventArgs e на GridViewSelectEventArgs:

Compilation Error

Description: An error occurred during the compilation of a resource required to service this request. Please review the following specific error details and modify your source code appropriately. 

Compiler Error Message: CS0123: No overload for 'VehiclesGridView_SelectedIndexChanged' matches delegate 'System.EventHandler'

Source Error:


Line 90:     <asp:UpdatePanel ID="SelectCarUP" runat="server" UpdateMode="Conditional">
Line 91:         <ContentTemplate>
Line 92:             <asp:GridView ID="VehiclesGridView" runat="server" AllowPaging="True" 
Line 93:                 AllowSorting="True" DataSourceID="VehiclesEDS" AutoGenerateColumns="False" 
Line 94:                 onselectedindexchanged="VehiclesGridView_SelectedIndexChanged" 

person SHeinema    schedule 24.01.2012    source источник
comment
Мне пришлось сделать это недавно, и я просто применил новый индекс к коллекции, к которой был привязан GridView.   -  person Sam I am says Reinstate Monica    schedule 24.01.2012
comment
Если я правильно понимаю, это может сработать, если я добавлю поле 'referenceIndex' в базу данных для выбранного объекта, а затем привяжу его изнутри страницы aspx на основе выбранного индекса .. знаете ли вы, какой код использовать для выполнения эта привязка?   -  person SHeinema    schedule 25.01.2012
comment
Я ожидаю, что ваш объект eventargs, который вы передаете в обработчик событий, будет иметь свойство, представляющее новый индекс. никаких изменений в БД не требуется. Можете ли вы опубликовать код вашего существующего обработчика методов?   -  person Sam I am says Reinstate Monica    schedule 25.01.2012
comment
Конечно, выложено выше. Возможно, мне все еще не совсем понятно, что вы имели в виду под «применением нового индекса к коллекции».   -  person SHeinema    schedule 25.01.2012


Ответы (1)


Если параметр, который вы хотите передать в getNextRide, действительно совпадает с выбранным индексом, я бы сделал такой обработчик событий

    protected void VehiclesGridView_SelectedIndexChanged(object sender, GridViewSelectEventArgs e)
    {
        if (ChangeAttemptedId && !IsSavedId)
        {
            Alert.Show("Dispatch assignment saved... (But you forgot to click Confirm or Cancel!)");
        }
        IsSavedId = false;
        ChangeAttemptedId = true;

        int selectedIndex = e.NewSelectedIndex;
        getNextRide(selectedIndex); //TODO: FIX             
    }

Кроме того, внутри обработчика событий вы можете получить доступ к отдельным элементам представления сетки следующим образом: VehiclesGridView.Rows[e.NewSelectedIndex].Cells[i], где i - это индекс вашей ячейки.

Кроме того, можете ли вы опубликовать строку, в которой вы устанавливаете источник данных VehiclesGridView, чтобы я мог придумать более чистый ответ

person Sam I am says Reinstate Monica    schedule 24.01.2012
comment
Хорошо, я думаю, что начинаю кое-что делать, но это дает мне ошибку компиляции (опубликовано выше), когда я пытаюсь использовать GridViewSelectEventArgs вместо EventArgs, и это тоже не позволяет мне использовать приведение. Я разместил больше кода выше. Кроме того, правильно ли я понимаю, что VehiclesGridView.Rows [e.NewSelectedIndex] .Cells [i] позволит мне получить доступ к carNumber, связанному с конкретной выбранной строкой? Это то значение, которое мне нужно. Спасибо за помощь ( : - person SHeinema; 25.01.2012
comment
Если ваш carNumber отображается в вашей сетке, значит, он должен. - person Sam I am says Reinstate Monica; 25.01.2012
comment
@SHeinema, хорошо, вы были правы, GridViewSelectEventArgs предназначен для другого обработчика событий, (OnSelectedIndexChanging) Вы все равно можете использовать VehiclesGridView.SelectedRow.Cells[i] - person Sam I am says Reinstate Monica; 25.01.2012