none
Problema ao usar ObjectDataSource - Object does not match target type. RRS feed

  • Pergunta

  • Estou usando um ObjectDataSource para preencher um grid, mas não quero utilizar banco de dados para isso. 

    Utilizo  tbm um ASPX GridView da devExpress. Com colunas de Novo, Editar e Deletar.

    O problema q ocorre é: Estou utilizando uma lista para armazenar os dados q são inseridos e retornando para o grid com o método select do objectdatasource. Quando Insiro um novo registro, O object datasource reseta todos os dados das variáveis q estão dentro da classe q possui os métodos de inserção, alteração, deleção e consulta do datasource. Procurei algo sobre ObjectCreating e parece q funciona para o q eu desejo, porém ainda está dando um erro dizendo q o objeto não encontra o tipo alvo.

     abaixo está o código aspx e aspx.cs. Fico grato pela ajuda.

    WebForm.aspx

    <%@ Import Namespace="TedASP2" %>
    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm5.aspx.cs" Inherits="TedASP2.WebForm5" %>
    <%@ Register Assembly="DevExpress.Web.ASPxEditors.v11.2, Version=11.2.11.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a"
        Namespace="DevExpress.Web.ASPxEditors" TagPrefix="dx" %>
    <%@ Register Assembly="DevExpress.Web.ASPxGridView.v11.2, Version=11.2.11.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a"
        Namespace="DevExpress.Web.ASPxGridView" TagPrefix="dx" %>
    <%@ Register Assembly="DevExpress.Web.v11.2, Version=11.2.11.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a"
        Namespace="DevExpress.Web.ASPxPopupControl" TagPrefix="dx" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <script runat="server">
        //cache da variável
        private void GetListLogic(object sender, ObjectDataSourceEventArgs e)
        {
            //Primeiramente checa para ver se uma instância desse objeto já existe no cache
            ListEndereco cachedLogic;
            cachedLogic = Cache["ListEndereco"] as ListEndereco;

            if (null == cachedLogic)
            {
                cachedLogic = new ListEndereco();
            }

            e.ObjectInstance = cachedLogic;
        }

        private void ReturnListLogic(object sender, ObjectDataSourceDisposingEventArgs e)
        {
            // Pega a instância do objeto com a qual o ObjectDataSource está trabalhando
            ListEndereco cachedLogic = e.ObjectInstance as ListEndereco;

            //Testa para determinar se a instância está no cache
            ListEndereco temp = Cache["ListEndereco"] as ListEndereco;

            if (null == temp)
            {
                // Se já existe no cache, adiciona
                Cache.Insert("ListEndereco", cachedLogic);
            }

            // Cancela o evento, então o objeto nunca será Descartado(Disposed) caso ele implemente IDisposable
            e.Cancel = true;
        }
    </script>
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
        <style type="text/css">
            a:link, a:visited
            {
                color: #034af3;
                height: 20px;
            }
        </style>
    </head>
    <body>
        <form id="form1" runat="server">
        <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="True">
        </asp:ScriptManager>
        <asp:UpdatePanel ID="UpdatePanel1" runat="server">
            <ContentTemplate>
                <div>
                    <dx:ASPxGridView ID="gridEndereco" runat="server" AutoGenerateColumns="False" CssFilePath="~/App_Themes/Office2010Blue/{0}/styles.css"
                        CssPostfix="Office2010Blue" DataSourceID="objEndereco" KeyFieldName="NrEnd" Width="980px"
                        ViewStateMode="Disabled" EnableTheming="True" KeyboardSupport="True">
                        <SettingsBehavior AllowFocusedRow="True" AllowSelectByRowClick="True" AllowSelectSingleRowOnly="True"
                            AllowSort="False" />
                        <SettingsEditing Mode="Inline" NewItemRowPosition="Bottom" />
                        <SettingsText CommandCancel="Cancelar" CommandUpdate="Salvar" EmptyDataRow="Não há dados para serem visualizados." />
                        <SettingsCustomizationWindow Enabled="True" />
                        <SettingsLoadingPanel Text="Carregando&amp;hellip;" />
                        <SettingsBehavior AllowFocusedRow="True" AllowSelectByRowClick="True" AllowSelectSingleRowOnly="True"
                            AllowSort="False" />
                        <SettingsEditing Mode="Inline" NewItemRowPosition="Bottom" />
                        <SettingsText CommandCancel="Cancelar" CommandUpdate="Salvar" EmptyDataRow="Não há dados para serem visualizados." />
                        <SettingsCustomizationWindow Enabled="True" />
                        <SettingsLoadingPanel Text="Carregando&amp;hellip;" />
                        <Columns>
                            <dx:GridViewCommandColumn ShowInCustomizationForm="True" VisibleIndex="0" Width="150px">
                                <EditButton Text="Editar" Visible="True">
                                </EditButton>
                                <NewButton Text="Novo" Visible="True">
                                </NewButton>
                                <DeleteButton Text="Deletar" Visible="True">
                                </DeleteButton>
                                <ClearFilterButton Visible="True">
                                </ClearFilterButton>
                            </dx:GridViewCommandColumn>
                            <dx:GridViewDataComboBoxColumn Caption="Tipo" FieldName="Tipo" ShowInCustomizationForm="True"
                                VisibleIndex="1">
                                <PropertiesComboBox ValueType="System.Int32" Width="150px">
                                    <Items>
                                        <dx:ListEditItem Text="Residencial" Value="0" />
                                        <dx:ListEditItem Text="Trabalho" Value="1" />
                                    </Items>
                                </PropertiesComboBox>
                            </dx:GridViewDataComboBoxColumn>
                            <dx:GridViewDataComboBoxColumn Caption="Uf" FieldName="Uf" ShowInCustomizationForm="True"
                                VisibleIndex="2">
                                <PropertiesComboBox ValueType="System.Int32" Width="60px">
                                    <Items>
                                        <dx:ListEditItem Text="AC" Value="0" />
                                        <dx:ListEditItem Text="AL" Value="1" />
                                        <dx:ListEditItem Text="AM" Value="2" />
                                        <dx:ListEditItem Text="AP" Value="3" />
                                        <dx:ListEditItem Text="BA" Value="4" />
                                        <dx:ListEditItem Text="CE" Value="5" />
                                        <dx:ListEditItem Text="DF" Value="6" />
                                        <dx:ListEditItem Text="ES" Value="7" />
                                        <dx:ListEditItem Text="GO" Value="8" />
                                        <dx:ListEditItem Text="MA" Value="9" />
                                        <dx:ListEditItem Text="MG" Value="10" />
                                        <dx:ListEditItem Text="MS" Value="11" />
                                        <dx:ListEditItem Text="MT" Value="12" />
                                        <dx:ListEditItem Text="PA" Value="13" />
                                        <dx:ListEditItem Text="PB" Value="14" />
                                        <dx:ListEditItem Text="PE" Value="15" />
                                        <dx:ListEditItem Text="PI" Value="16" />
                                        <dx:ListEditItem Text="PR" Value="17" />
                                        <dx:ListEditItem Text="RJ" Value="18" />
                                        <dx:ListEditItem Text="RN" Value="19" />
                                        <dx:ListEditItem Text="RO" Value="20" />
                                        <dx:ListEditItem Text="RR" Value="21" />
                                        <dx:ListEditItem Text="RS" Value="22" />
                                        <dx:ListEditItem Text="SP" Value="23" />
                                        <dx:ListEditItem Text="SE" Value="24" />
                                        <dx:ListEditItem Text="TO" Value="25" />
                                    </Items>
                                </PropertiesComboBox>
                            </dx:GridViewDataComboBoxColumn>
                            <dx:GridViewDataTextColumn Caption="Cep" FieldName="Cep" ShowInCustomizationForm="True"
                                VisibleIndex="3" Width="80px">
                            </dx:GridViewDataTextColumn>
                            <dx:GridViewDataTextColumn Caption="Localidade" FieldName="Localidade" ShowInCustomizationForm="True"
                                VisibleIndex="4">
                            </dx:GridViewDataTextColumn>
                            <dx:GridViewDataTextColumn Caption="Bairro" FieldName="Bairro" ShowInCustomizationForm="True"
                                VisibleIndex="5">
                            </dx:GridViewDataTextColumn>
                            <dx:GridViewDataTextColumn Caption="Logradouro" FieldName="Logradouro" ShowInCustomizationForm="True"
                                VisibleIndex="6">
                            </dx:GridViewDataTextColumn>
                            <dx:GridViewDataTextColumn Caption="Complemento" FieldName="Complemento" ShowInCustomizationForm="True"
                                VisibleIndex="7">
                            </dx:GridViewDataTextColumn>
                            <dx:GridViewDataTextColumn Caption="Nº" FieldName="NrEnd" ShowInCustomizationForm="True"
                                VisibleIndex="8">
                            </dx:GridViewDataTextColumn>
                            <dx:GridViewDataTextColumn Caption="CodIBGE" FieldName="CodIBGE" ShowInCustomizationForm="True"
                                Visible="False" VisibleIndex="9">
                            </dx:GridViewDataTextColumn>
                        </Columns>
                        <SettingsBehavior AllowFocusedRow="True" AllowSelectByRowClick="True" AllowSelectSingleRowOnly="True"
                            AllowSort="False" />
                        <SettingsEditing Mode="Inline" NewItemRowPosition="Bottom" />
                        <SettingsText CommandCancel="Cancelar" CommandUpdate="Salvar" EmptyDataRow="Não há dados para serem visualizados." />
                        <SettingsCustomizationWindow Enabled="True" />
                        <SettingsLoadingPanel Text="Carregando&amp;hellip;" />
                        <SettingsBehavior AllowFocusedRow="True" AllowSelectByRowClick="True" AllowSelectSingleRowOnly="True"
                            AllowSort="False" />
                        <SettingsEditing Mode="Inline" NewItemRowPosition="Bottom" />
                        <SettingsText CommandCancel="Cancelar" CommandUpdate="Salvar" EmptyDataRow="Não há dados para serem visualizados." />
                        <SettingsCustomizationWindow Enabled="True" />
                        <SettingsLoadingPanel Text="Carregando&amp;hellip;" />
                        <SettingsBehavior AllowFocusedRow="True" AllowSelectByRowClick="True" AllowSelectSingleRowOnly="True"
                            AllowSort="False" />
                        <SettingsEditing Mode="Inline" NewItemRowPosition="Bottom" />
                        <SettingsText CommandCancel="Cancelar" CommandUpdate="Salvar" EmptyDataRow="Não há dados para serem visualizados." />
                        <SettingsCustomizationWindow Enabled="True" />
                        <SettingsLoadingPanel Text="Carregando&amp;hellip;" />
                        <SettingsBehavior AllowFocusedRow="True" AllowSelectByRowClick="True" AllowSelectSingleRowOnly="True"
                            AllowSort="False" />
                        <SettingsEditing Mode="Inline" NewItemRowPosition="Bottom" />
                        <SettingsText CommandCancel="Cancelar" CommandUpdate="Salvar" EmptyDataRow="Não há dados para serem visualizados." />
                        <SettingsCustomizationWindow Enabled="True" />
                        <SettingsLoadingPanel Text="Carregando&amp;hellip;" />
                        <SettingsBehavior AllowFocusedRow="True" AllowSelectByRowClick="True" AllowSelectSingleRowOnly="True"
                            AllowSort="False" />
                        <SettingsEditing Mode="Inline" NewItemRowPosition="Bottom" />
                        <SettingsText CommandCancel="Cancelar" CommandUpdate="Salvar" EmptyDataRow="Não há dados para serem visualizados." />
                        <SettingsCustomizationWindow Enabled="True" />
                        <SettingsLoadingPanel Text="Carregando&amp;hellip;" />
                        <SettingsBehavior AllowFocusedRow="True" AllowSelectByRowClick="True" AllowSelectSingleRowOnly="True"
                            AllowSort="False" />
                        <SettingsEditing Mode="Inline" NewItemRowPosition="Bottom" />
                        <SettingsText CommandCancel="Cancelar" CommandUpdate="Salvar" EmptyDataRow="Não há dados para serem visualizados." />
                        <SettingsCustomizationWindow Enabled="True" />
                        <SettingsLoadingPanel Text="Carregando&amp;hellip;" />
                        <Images SpriteCssFilePath="~/App_Themes/Office2010Blue/{0}/sprite.css">
                            <LoadingPanelOnStatusBar Url="~/App_Themes/Office2010Blue/GridView/Loading.gif">
                            </LoadingPanelOnStatusBar>
                            <LoadingPanel Url="~/App_Themes/Office2010Blue/GridView/Loading.gif">
                            </LoadingPanel>
                        </Images>
                        <ImagesFilterControl>
                            <LoadingPanel Url="~/App_Themes/Office2010Blue/GridView/Loading.gif">
                            </LoadingPanel>
                        </ImagesFilterControl>
                        <Styles CssFilePath="~/App_Themes/Office2010Blue/{0}/styles.css" CssPostfix="Office2010Blue">
                            <Header ImageSpacing="5px" SortingImageSpacing="5px">
                            </Header>
                            <LoadingPanel ImageSpacing="5px">
                            </LoadingPanel>
                        </Styles>
                        <StylesPager>
                            <PageNumber ForeColor="#3E4846">
                            </PageNumber>
                            <Summary ForeColor="#1E395B">
                            </Summary>
                        </StylesPager>
                        <StylesEditors ButtonEditCellSpacing="0">
                            <ProgressBar Height="21px">
                            </ProgressBar>
                        </StylesEditors>
                    </dx:ASPxGridView>
                    <br />
                    <asp:ObjectDataSource ID="objEndereco" runat="server" InsertMethod="InsertEndereco"
                        SelectMethod="SelectEndereco" TypeName="TedASP2.WebForm5" UpdateMethod="EditEndereco"
                        DeleteMethod="DeleteEndereco" ConflictDetection="CompareAllValues" 
                        OnObjectDisposing="ReturnListLogic" OnObjectCreating="GetListLogic" 
                        EnableCaching="True">
                        <UpdateParameters>
                            <asp:Parameter Name="Tipo" Type="Int32" />
                            <asp:Parameter Name="Cep" Type="String" />
                            <asp:Parameter Name="Uf" Type="Int16" />
                            <asp:Parameter Name="Localidade" Type="String" />
                            <asp:Parameter Name="Bairro" Type="String" />
                            <asp:Parameter Name="Logradouro" Type="String" />
                            <asp:Parameter Name="Complemento" Type="String" />
                            <asp:Parameter Name="NrEnd" Type="String" />
                            <asp:Parameter Name="CodIBGE" Type="String" />
                            <asp:ControlParameter Name="AIndex" ControlID="gridEndereco" PropertyName="EditingRowVisibleIndex" />
                        </UpdateParameters>
                        <InsertParameters>
                            <asp:Parameter Name="Tipo" Type="Int32" />
                            <asp:Parameter Name="Cep" Type="String" />
                            <asp:Parameter Name="Uf" Type="Int16" />
                            <asp:Parameter Name="Localidade" Type="String" />
                            <asp:Parameter Name="Bairro" Type="String" />
                            <asp:Parameter Name="Logradouro" Type="String" />
                            <asp:Parameter Name="Complemento" Type="String" />
                            <asp:Parameter Name="NrEnd" Type="String" />
                            <asp:Parameter Name="CodIBGE" Type="String" />
                        </InsertParameters>
                        <DeleteParameters>
                            <asp:ControlParameter Name="AIndex" ControlID="gridEndereco" PropertyName="FocusedRowIndex" />
                            <asp:Parameter Name="NrEnd" Type="String" />
                        </DeleteParameters>
                    </asp:ObjectDataSource>
                    <br />
                </div>
            </ContentTemplate>
        </asp:UpdatePanel>
        </form>
    </body>
    </html>

    WebForm5.aspx.cs

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Linq;
    using System.Drawing;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using Entidades;
    using TedEntityLib;
    using TedAdoFBLib;
    using System.IO;

    namespace TedASP2
    {
        [Serializable]
        public class ListEndereco:List<Endereco>, IDisposable
        {
            public void Dispose()
            {
            }
        }
        public partial class WebForm5 : System.Web.UI.Page
        {
            const string KEY_VIEW_STATE = "__ListEnd";
            ListEndereco ListEnd;
            protected void Page_Load(object sender, EventArgs e)
            {
                if (!IsPostBack && !IsCallback)
                {
                    ListEnd = new ListEndereco();
                    Endereco endereco = new Endereco();
                    endereco.Tipo = TipoEndereco.Residencial;
                    endereco.Cep = "123123123";
                    endereco.Uf = EndUF.RJ;
                    endereco.Localidade = "saqua";
                    endereco.Bairro = "Bairro";
                    endereco.Logradouro = "Logradouro";
                    endereco.Complemento = "Complemento";
                    endereco.NrEnd = "1231";
                    endereco.CodIBGE = "3123";
                    ListEnd.Add(endereco);
                    ViewState.Add(KEY_VIEW_STATE, ListEnd);
                }
                else
                    ListEnd = (ListEndereco)ViewState[KEY_VIEW_STATE];
            }

           //metodos do ObjectDataSource para manipulação dos dados
            public ListEndereco SelectEndereco()
            {
                if (ListEnd != null)
                {
                    ListEnd = (ListEndereco)ViewState[KEY_VIEW_STATE];
                    return ListEnd;
                }
                else
                    return CreateList();
            }
            //instancia a lista de enderecos caso esteja como nula
            public ListEndereco CreateList()
            {
                ListEnd = new ListEndereco();
                //ListEnd = (ListEndereco)ViewState[KEY_VIEW_STATE];
                return ListEnd;
            }
            //insere os valores em uma lista de enderecos da entidade
            public void InsertEndereco(Int32 Tipo, string Cep, Int16 Uf, string Localidade, string Bairro, string Logradouro, string Complemento, string NrEnd, string CodIBGE)
            {
                ListEnd = (ListEndereco)ViewState[KEY_VIEW_STATE];
                Endereco endereco = new Endereco();
                endereco.Tipo = (TipoEndereco)Tipo;
                endereco.Cep = Cep;
                endereco.Uf = (EndUF)Uf;
                endereco.Localidade = Localidade;
                endereco.Bairro = Bairro;
                endereco.Logradouro = Logradouro;
                endereco.Complemento = Complemento;
                endereco.NrEnd = NrEnd;
                endereco.CodIBGE = CodIBGE;
                ListEnd.Add(endereco);
                ViewState.Add(KEY_VIEW_STATE, ListEnd); 
            }

            //edita os dados do endereco
            public void EditEndereco(int AIndex, Int32 Tipo, string Cep, Int16 Uf, string Localidade, string Bairro, string Logradouro, string Complemento, string NrEnd, string CodIBGE)
            {
                ListEnd = (ListEndereco)ViewState[KEY_VIEW_STATE];
                Endereco endereco = ListEnd[AIndex];
                endereco.Tipo = (TipoEndereco)Tipo;
                endereco.Cep = Cep;
                endereco.Uf = (EndUF)Uf;
                endereco.Localidade = Localidade;
                endereco.Bairro = Bairro;
                endereco.Logradouro = Logradouro;
                endereco.Complemento = Complemento;
                endereco.NrEnd = NrEnd;
                endereco.CodIBGE = CodIBGE;
                ViewState.Add(KEY_VIEW_STATE, ListEnd);
            }
            //deleta enderecos
            public void DeleteEndereco(int AIndex, string NrEnd)
            {
                ListEnd = (ListEndereco)ViewState[KEY_VIEW_STATE];
                ListEnd.RemoveAt(AIndex);
                ViewState.Add(KEY_VIEW_STATE, ListEnd);
            }
        }
    }

    quinta-feira, 21 de junho de 2012 12:40

Todas as Respostas