LA.Net
Reflexões sobre C#, .Net e programação em geral

Hoje voltei a tentar efectuar a personalização da criação do objecto (definido pela propriedade DataObjectTypeName). Até à versão CTP de Dezembro era impossível procedermos a esta personalização. Contudo, parece que a Microsoft cumpriu o que havia prometido e a partir de agora já podemos personalizar a criação de componentes deste tipo. Para tal, temos de garantir o seguinte:

  • não podemos definir a propriedade DataObjectTypeName (se utilizarmos esta propriedade, o controlo irá tentar sempre instanciar um elemento do tipo da classe indicada na propriedade);
  • processar o evento XXXing (por exemplo, se necessitarmos de criar o objecto personalizado durante a actualização de dados devemos processar o evento OnUpdating);
  • durante este evento devemos remover todos os parâmetros da colecção InputArguments e adicionar um novo com o objecto criado para esse efeito. Para que tudo funcione, é importante adicionarmos o parâmetro com o mesmo nome do parâmetro utilizado no método.

O código seguinte demonstra os passos necessários:

<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"

"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<script runat="server">
    void ProcessUpdated( object source, ObjectDataSourceStatusEventArgs args )
    {
        if(args.Exception != null)
        {
            info.Text = args.Exception.ToString( );
            args.ExceptionHandled = true;
            return;
        }

        if(Convert.ToBoolean( args.ReturnValue ))
            info.Text = "Actualização efectuada com sucesso";
        else
            info.Text = "Ocorreu um erro durante a actualização! Por favor, volte a tentar";
    }

    void ProcessUpdating( object sender, ObjectDataSourceMethodEventArgs args )
    {
        string cnnString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" +
HttpContext.Current.Server.MapPath("~/app_Data/Test.mdb");        
        BetterImplementation.AlunosCollectionDB db    = new
BetterImplementation.AlunosCollectionDB(cnnString);
        ImproperImplementation.Alunos           aluno = db.LoadAlunoFromDb(
(int)frm.DataKey.Value);
       
        aluno.Morada = args.InputParameters["Morada"].ToString();
        aluno.Nome   = args.InputParameters["Nome"].ToString();

        args.InputParameters.Clear( );
        args.InputParameters.Add("alun", aluno);
    }
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <h3>Actualização de dados com ObjectDataSource sem construtor público

(DataObjectTypeName)</h3>
    <form id="form1" runat="server">
        <asp:FormView runat="server" ID="frm" DefaultMode="Edit" DataKeyNames="IdAlunos"

DataSourceID="source">
            <EditItemTemplate>
              Nome Aluno: <asp:TextBox runat="server" ID="nome" Text='<%# Bind("Nome") %>'
/><br />
                Morada: <asp:TextBox runat="server" ID="Morada" Text='<%# Bind("Morada") %>'
/><p></p>
                <asp:Button ID="udpate" CommandName="Update" runat="server"
Text="Actualizar" BorderColor="Black"
                    BorderStyle="solid" BorderWidth="1px" />
                &nbsp;&nbsp;               
            </EditItemTemplate>
        </asp:FormView>
        <asp:ObjectDataSource runat="server" ID="source"
typename="ImproperImplementation.AlunosCollectionDB"
            SelectMethod="LoadAlunoFromDb" UpdateMethod="UpdateDb"

OnUpdated="ProcessUpdated" OnUpdating="ProcessUpdating">
            <SelectParameters>
                <asp:Parameter Name="id" DefaultValue="1" Type="int32" />
            </SelectParameters>
        </asp:ObjectDataSource> 
        <asp:Label runat="server" ID="info" /> 
    </form>
</body>
</html>

 

posted on Sunday, March 20, 2005 10:38 PM
Comments
No comments posted yet
Title  
Name  
Url
Box Code
Protected by FormShield
Comments