Не удалось загрузить viewstate при попытке обновить / отменить просмотр gridview? - PullRequest
3 голосов
/ 16 ноября 2011

Фон

У меня есть GridView, который строит таблицу, используя ObjectDataSource.Этот источник использует веб-службы для сегментов выбора и обновления.При щелчке в разделе редактирования отображается DropDownList для двух столбцов, которые необходимо редактировать.Оба DropDownList используют отдельные ObjectDataSource хранилища WebServices, которые получают значения, предназначенные для хранения в этом DropDownList.

В данный момент работает

На данный момент все вышеперечисленное работает.Когда я загружаю страницу, таблица показывает правильные данные.Когда я нажимаю кнопку редактирования, два DropDownList получают правильные данные, сохраненные в них из WebService.

Проблема

Когда я выбираюопция для обновления БД или когда я выбираю отмену, страница выдает ошибку и завершается ошибкой.Я не совсем уверен, почему это происходит, за исключением того, что это связано с неправильной обработкой привязки.Я хотел бы знать, как связать значения, полученные из DropDownList, для использования при обновлении базы данных?

Ниже вы найдете то, что я пробовал до сих пор:

<asp:GridView ID="GridViewHolder" 
                          runat="server" 
                          AllowPaging="True" 
                          AutoGenerateColumns="False" 
                          BackColor="Transparent" 
                          BorderColor="#999999" 
                          BorderStyle="Ridge" 
                          BorderWidth="3px" 
                          CellPadding="4" 
                          CellSpacing="2" 
                          DataSourceID="MachineDataSet" 
                          ForeColor="Black" 
                          HeaderStyle-HorizontalAlign="Center" 
                          HorizontalAlign="Center"  
                          RowStyle-HorizontalAlign="Center" Width="574px"
                          OnRowUpdating="GridViewHolder_Updating"
                          OnRowCancelingEdit="GridViewHolder_Canceling"
                          OnRowUpdated="GridViewHolder_Updated"
                          OnRowEditing="GridViewHolder_Editing">
                <RowStyle BackColor="Transparent" HorizontalAlign="Center" />
                <Columns>
                    <asp:BoundField DataField="ID" 
                                    HeaderText="ID" 
                                    SortExpression="ID" 
                                    Visible="False" />
                    <asp:BoundField DataField="SiteName" 
                                    HeaderText="Site Name" 
                                    SortExpression="SiteName"
                                    ReadOnly="true" />
                    <asp:BoundField DataField="Name" 
                                    HeaderText="Machine Name" 
                                    ReadOnly="true" 
                                    SortExpression="Name" />
                    <asp:TemplateField HeaderText="Machine Type" SortExpression="MachineType">
                        <EditItemTemplate>
                            <asp:ObjectDataSource ID="GetMachineType" 
                                                  runat="server" 
                                                  SelectMethod="GetMachineTypeList" 
                                                  TypeName="Datamart.UI.Reporting.Web.FilteredReportInputsSvc.FilteredReportInputsService">
                                <SelectParameters>
                                    <asp:Parameter Name="siteid" Type="String" />
                                </SelectParameters>
                            </asp:ObjectDataSource>
                            <asp:DropDownList ID="MachineTypeDropDown" 
                                              runat="server" 
                                              AppendDataBoundItems="True" 
                                              DataSourceID="GetMachineType" 
                                              DataTextField="Name" 
                                              DataValueField="ID"                                               
                                              Height="21px" 
                                              Width="217px">
                                <asp:ListItem Enabled="true" 
                                              Text="Select a Machine Type.">
                                </asp:ListItem>
                            </asp:DropDownList>
                        </EditItemTemplate>
                        <ItemTemplate>
                            <asp:Label ID="Label1" 
                                       runat="server" 
                                       Text='<%# Bind("MachineType") %>'>
                            </asp:Label>
                        </ItemTemplate>
                    </asp:TemplateField>
                    <asp:TemplateField HeaderText="Machine Model" SortExpression="MachineModel">
                        <EditItemTemplate>
                            <asp:ObjectDataSource ID="GetMachineModel" 
                                                  runat="server" 
                                                  SelectMethod="GetMachineModelList" 
                                                  TypeName="Datamart.UI.Reporting.Web.FilteredReportInputsSvc.FilteredReportInputsService">
                                <SelectParameters>
                                    <asp:Parameter Name="siteid" Type="String" />
                                </SelectParameters>
                            </asp:ObjectDataSource>
                            <asp:DropDownList ID="MachineModelDropDown" 
                                              runat="server" 
                                              AppendDataBoundItems="True" 
                                              DataSourceID="GetMachineModel" 
                                              DataTextField="Name" 
                                              DataValueField="ID"                                               
                                              Height="21px" 
                                              Width="217px">
                                <asp:ListItem Enabled="true" 
                                              Text="Select a Machine Model."
                                              Value="NULL">
                                </asp:ListItem>
                            </asp:DropDownList>
                        </EditItemTemplate>
                        <ItemTemplate>
                            <asp:Label ID="Label2" 
                                       runat="server" 
                                       Text='<%# Bind("MachineModel") %>'>
                            </asp:Label>
                        </ItemTemplate>
                    </asp:TemplateField>
                    <asp:CommandField ButtonType="Button" ShowEditButton="True" />
                </Columns>
                <FooterStyle BackColor="Transparent" />
                <PagerStyle BackColor="Transparent" 
                            ForeColor="Black" 
                            HorizontalAlign="Left" />
                <SelectedRowStyle BackColor="Transparent" 
                                  Font-Bold="True" 
                                  ForeColor="White" />
                <HeaderStyle BackColor="Black" 
                             Font-Bold="True" 
                             ForeColor="White" 
                             HorizontalAlign="Center" />
         </asp:GridView>

Где проблема, кажется, находится в этой области ниже:

<asp:TemplateField HeaderText="Machine Type" 
    SortExpression="MachineType">
    <EditItemTemplate>
        <asp:ObjectDataSource ID="GetMachineType" 
            runat="server" 
            SelectMethod="GetMachineTypeList" 
            TypeName="Datamart.UI.Reporting.Web.FilteredReportInputsSvc.FilteredReportInputsService">
            <SelectParameters>
                <asp:Parameter Name="siteid" Type="String" />
            </SelectParameters>
        </asp:ObjectDataSource>
        <asp:DropDownList ID="MachineTypeDropDown" 
            runat="server" 
            DataSourceID="GetMachineType"
            DataTextField="Name"
            DataValueField="ID"                                               
            Height="21px" 
            Width="217px"
            AppendDataBoundItems="true">
            <asp:ListItem Enabled="true"
                Selected="True"
                Text="Select a Machine Type.">                                 
            </asp:ListItem>
        </asp:DropDownList>
    </EditItemTemplate>
    <ItemTemplate>
        <asp:Label ID="Label1" 
            runat="server" 
            Text='<%# Bind("MachineType") %>'>
        </asp:Label>
    </ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Machine Model" 
    SortExpression="MachineModel">
    <EditItemTemplate>
        <asp:ObjectDataSource ID="GetMachineModel" 
            runat="server" 
            SelectMethod="GetMachineModelList" 
            <asp:TemplateField HeaderText="Machine Type" SortExpression="MachineType">
                    <EditItemTemplate>
                        <asp:ObjectDataSource ID="GetMachineType" 
                                              runat="server" 
                                              SelectMethod="GetMachineTypeList" 
                                              TypeName="Datamart.UI.Reporting.Web.FilteredReportInputsSvc.FilteredReportInputsService">
                            <SelectParameters>
                                <asp:Parameter Name="siteid" Type="String" />
                            </SelectParameters>
                        </asp:ObjectDataSource>
                        <asp:DropDownList ID="MachineTypeDropDown" 
                                          runat="server" 
                                          AppendDataBoundItems="True" 
                                          DataSourceID="GetMachineType" 
                                          DataTextField="Name" 
                                          DataValueField="ID"                                               
                                          Height="21px" 
                                          Width="217px">
                            <asp:ListItem Enabled="true" 
                                          Text="Select a Machine Type.">
                            </asp:ListItem>
                        </asp:DropDownList>
                    </EditItemTemplate>
                    <ItemTemplate>
                        <asp:Label ID="Label1" 
                                   runat="server" 
                                   Text='<%# Bind("MachineType") %>'>
                        </asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="Machine Model" SortExpression="MachineModel">
                    <EditItemTemplate>
                        <asp:ObjectDataSource ID="GetMachineModel" 
                                              runat="server" 
                                              SelectMethod="GetMachineModelList" 


TypeName="Datamart.UI.Reporting.Web.FilteredReportInputsSvc.FilteredReportInputsService">
                            <SelectParameters>
                                <asp:Parameter Name="siteid" Type="String" />
                            </SelectParameters>
                        </asp:ObjectDataSource>
                        <asp:DropDownList ID="MachineModelDropDown" 
                                          runat="server" 
                                          AppendDataBoundItems="True" 
                                          DataSourceID="GetMachineModel" 
                                          DataTextField="Name" 
                                          DataValueField="ID"                                               
                                          Height="21px" 
                                          Width="217px">
                            <asp:ListItem Enabled="true" 
                                          Text="Select a Machine Model."
                                          Value="NULL">
                            </asp:ListItem>
                        </asp:DropDownList>
                    </EditItemTemplate>
                    <ItemTemplate>
                        <asp:Label ID="Label2" 
                                   runat="server" 
                                   Text='<%# Bind("MachineModel") %>'>
                        </asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>

Обновлено для bounty

Моя общая проблема: используя gridview, я не могуполучить мои редактировать, обновлять, отменять кнопки для работы.Так что я хотел бы также знать, так как я назначаю вознаграждение за это: как я могу заставить эти события работать должным образом, используя ObjectDataSource s?

Я уже знаю, что веб-сервисы работают должным образом, япросто не знаю, как загрузить нужные параметры с правильными значениями данных из таблицы.Будем благодарны за любую помощь или предложения.

Ошибка, выданная в данный момент:

Не удалось загрузить состояние просмотра.Дерево управления, в которое загружается состояние просмотра, должно соответствовать дереву управления, которое использовалось для сохранения состояния просмотра во время предыдущего запроса.Например, при динамическом добавлении элементов управления элементы, добавленные во время обратной передачи, должны соответствовать типу и расположению элементов управления, добавленных во время первоначального запроса.

Я не уверен, как получить обновлениеи отменять события для корректного запуска, поэтому я пытался использовать обработчики событий OnRow*, но ни один из них не работал и не срабатывал, даже когда я устанавливал точку останова для метода, просто чтобы посмотреть, сработает ли событие.

Update2

Итак, как я и просил, я имею в виду код для работы с событиями, которые, как я думал, могут сработать, ( note :я пробовал это почти со всеми другими событиями).Когда я запускаю отладчик, присоединяющий страницу к процессу asp.net, и нажимаю кнопку обновления, кнопку отмены или кнопку редактирования, я ожидаю, что страница перейдет к точке останова, однако этого не происходит.

Примечание: Я также знаю, что код, скорее всего, неверный, но я не хотел ничего исправлять до тех пор, пока не узнал, какое событие будет правильным, которое срабатывает для кнопок обновления и отмены.

    protected void GridViewHolder_Updating(object sender, GridViewUpdateEventArgs e) 
{

    int machineid;
    string machineTypeid;
    string machineModelid;

    GridViewRow row = (GridViewRow)GridViewHolder.Rows[e.RowIndex];
    Label id = (Label)row.FindControl("ID");
    DropDownList mType1 = GridViewHolder.Rows[e.RowIndex].FindControl("MachineTypeDropDown") as DropDownList;
    e.NewValues["MachineType"] = mType1.SelectedValue;
    DropDownList mType = (DropDownList)row.FindControl("Machine_Type");
    DropDownList mModel = (DropDownList)row.FindControl("Machine_Model");

    machineid = Convert.ToInt32(id);
    machineTypeid = mType.DataValueField.ToString();
    machineModelid = mModel.DataValueField.ToString();

    inputsService.UpdateMachineTypes(machineid, machineTypeid);
    inputsService.UpdateMachineModels(machineid, machineModelid);

}

protected void GridViewHolder_Updated(object sender, GridViewUpdatedEventArgs e)
{

}

/// <summary>
/// Handles the Click event of the cancel button under edit in the gridview control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="System.Web.UI.WebControls.GridViewCancelEditEventArgs"/> instance containing the event data.</param>
protected void GridViewHolder_Canceling(object sender, GridViewCancelEditEventArgs e)
{
    //reset the edit index
    GridViewHolder.EditIndex = -1;
    //Bind data to GridViewHolder
    BindData();
}

protected void GridViewHolder_Editing(object sender, GridViewEditEventArgs e)
{

}
#endregion

#region Private Methods

private void BindData()
{
    GridViewHolder.DataSource = Session["MachineTable"];
    GridViewHolder.DataBind();
}

#endregion

Обновление 3

Хорошо, вы найдете над последней попыткой, которую я предпринял, чтобы заставить кнопки обновления и отмены работать должным образом вgridview.

Любая помощь или предложения приветствуются.

Спасибо.

Ответы [ 3 ]

2 голосов
/ 23 ноября 2011

Я никогда не видел, чтобы ObjectDataSource использовал внутри шаблона - всегда контролирует явное заполнение / привязку в событии ItemDataBound сетки.

Сложные вещи, подобные этому, я бы использовал ItemTemplate, а затем имел бы все элементы управления (в вашем случае Label и DropDown). Каждый будет переключаться на основе Grid.EditIndex > -1.

Я бы начал с комментирования частей сетки (например, целого куска с ObjectDataSource внутри EditTemplate) и посмотрел, работает ли это.

Если этот выпадающий список / поле является виновником, я бы переработал его, чтобы он был заполнен внутри события Grid_ItemDataBound (), а не внутри разметки.

2 голосов
/ 21 ноября 2011

Я подозреваю, что ошибка ViewState вызвана кодом из-за кода и не вызывается кодом GridView, который вы опубликовали.Можете ли вы опубликовать код для ваших OnRow... методов и любого Page_Load / Page_Init кода?

Сказав это, чтобы ваши обновления работали на DropDownList, вы управляете 'Вам нужно будет добавить код в метод RowUpdating.Вот сообщение в блоге Питера Келлнера , но соответствующий код:

protected void GridViewIncomingUrls_RowUpdating(object sender, GridViewUpdateEventArgs e) { 
        DropDownList dropDownListUser = GridViewIncomingUrls.Rows[e.RowIndex].FindControl("MachineTypeDropDown") as DropDownList;
        e.NewValues["MachineTypeID"] = dropDownListUser.SelectedValue;
}

Кроме того, вы можете установить свойство SelectedValue ваших раскрывающихся списков, чтобы ранее выбранныйзначение предварительно заполняется, когда пользователь нажимает кнопку редактирования:

 <asp:DropDownList 
    ID="MachineModelDropDown"  
    SelectedValue='<%#Bind("MachineModelID") %>'
    ...
0 голосов
/ 28 ноября 2011

Одним из возможных решений было бы включение состояния представления в значение false, как показано ниже:

EnableViewState = "false"

Ниже приведены некоторые ссылки.

http://forums.asp.net/t/1159585.aspx/1

http://forums.asp.net/t/1295517.aspx/1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...