Configurar programaticamente os valores do parâmetro ObjectDataSource (C#)

por Scott Mitchell

Baixar PDF

Neste tutorial, examinaremos a adição de um método à nossa DAL e BLL que aceita um único parâmetro de entrada e retorna dados. O exemplo definirá esse parâmetro programaticamente.

Introdução

Como vimos no tutorial anterior, várias opções estão disponíveis para passar valores de parâmetro declarativamente para os métodos do ObjectDataSource. Se o valor do parâmetro for codificado, vier de um controle Web na página ou estiver em qualquer outra fonte legível por um objeto de fonte Parameter de dados, por exemplo, esse valor poderá ser associado ao parâmetro de entrada sem escrever uma linha de código.

No entanto, pode haver momentos em que o valor do parâmetro vem de alguma fonte ainda não contabilizado por um dos objetos internos da fonte Parameter de dados. Se nosso site deu suporte a contas de usuário, talvez queiramos definir o parâmetro com base na ID de Usuário do visitante conectado no momento. Ou talvez seja necessário personalizar o valor do parâmetro antes de enviá-lo ao método do objeto subjacente objectDataSource.

Sempre que o método objectDataSource é Select invocado, o ObjectDataSource primeiro gera seu evento Selecting. O método do objeto subjacente objectDataSource é invocado. Após a conclusão do evento Selected do ObjectDataSource (a Figura 1 ilustra essa sequência de eventos). Os valores de parâmetro passados para o método do objeto subjacente objectDataSource podem ser definidos ou personalizados em um manipulador de eventos para o Selecting evento.

Os Eventos Selecionados e Selecionados do ObjectDataSource são disparados antes e depois que o método do objeto subjacente é invocado

Figura 1: Os Eventos e Selecting ObjectDataSource Selected são disparados antes e depois que o método do objeto subjacente é invocado (clique para exibir a imagem em tamanho real)

Neste tutorial, examinaremos a adição de um método à nossa DAL e BLL que aceita um único parâmetro Monthde entrada , do tipo int e retorna um EmployeesDataTable objeto preenchido com os funcionários que têm seu aniversário de contratação no especificado Month. Nosso exemplo definirá esse parâmetro programaticamente com base no mês atual, mostrando uma lista de "Aniversários de funcionários neste mês".

Vamos começar!

Etapa 1: Adicionar um método aEmployeesTableAdapter

Para nosso primeiro exemplo, precisamos adicionar um meio para recuperar os funcionários que HireDate ocorreram em um mês especificado. Para fornecer essa funcionalidade de acordo com nossa arquitetura, precisamos primeiro criar um método no EmployeesTableAdapter que mapeia para a instrução SQL adequada. Para fazer isso, comece abrindo o Conjunto de Dados Tipado northwind. Clique com o botão direito do mouse no EmployeesTableAdapter rótulo e escolha Adicionar Consulta.

Adicionar uma nova consulta ao EmployeesTableAdapter

Figura 2: Adicionar uma nova consulta ao EmployeesTableAdapter (Clique para exibir a imagem em tamanho real)

Escolha adicionar uma instrução SQL que retorna linhas. Quando você chegar à tela Especificar uma SELECT Instrução, a instrução padrão SELECT do EmployeesTableAdapter já será carregada. Basta adicionar na WHERE cláusula: WHERE DATEPART(m, HireDate) = @Month. DATEPART é uma função T-SQL que retorna uma determinada parte de data de um datetime tipo; nesse caso, estamos usando DATEPART para retornar o mês da HireDate coluna.

Retornar somente as linhas em que a coluna HireDate é menor ou igual à classe de intervalo de <=parâmetro @HiredBeforeDate " />

Figura 3: retornar somente as linhas em que a HireDate coluna é menor ou igual ao @HiredBeforeDate parâmetro (clique para exibir a imagem em tamanho real)

Por fim, altere os nomes de FillBy método e GetDataBy para FillByHiredDateMonth e GetEmployeesByHiredDateMonth, respectivamente.

Escolher nomes de método mais apropriados do que FillBy e GetDataBy

Figura 4: escolha nomes de método mais apropriados do que FillBy e GetDataBy (clique para exibir imagem em tamanho real)

Clique em Concluir para concluir o assistente e retornar à superfície de design do Conjunto de Dados. O EmployeesTableAdapter agora deve incluir um novo conjunto de métodos para acessar funcionários contratados em um mês especificado.

Os novos métodos aparecem na superfície de design do Conjunto de Dados

Figura 5: Os novos métodos aparecem na superfície de design do Conjunto de Dados (clique para exibir a imagem em tamanho real)

Etapa 2: Adicionar oGetEmployeesByHiredDateMonth(month)método à camada de lógica de negócios

Como nossa arquitetura de aplicativo usa uma camada separada para a lógica de negócios e a lógica de acesso a dados, precisamos adicionar um método à nossa BLL que chama o DAL para recuperar funcionários contratados antes de uma data especificada. Abra o EmployeesBLL.cs arquivo e adicione o seguinte método:

[System.ComponentModel.DataObjectMethodAttribute
    (System.ComponentModel.DataObjectMethodType.Select, false)]
public Northwind.EmployeesDataTable GetEmployeesByHiredDateMonth(int month)
{
    return Adapter.GetEmployeesByHiredDateMonth(month);
}

Assim como acontece com nossos outros métodos nessa classe, GetEmployeesByHiredDateMonth(month) basta chamar para o DAL e retornar os resultados.

Etapa 3: Exibindo funcionários cujo aniversário de contratação é este mês

Nossa etapa final para este exemplo é exibir os funcionários cujo aniversário de contratação é este mês. Comece adicionando um GridView à ProgrammaticParams.aspx página na BasicReporting pasta e adicione um novo ObjectDataSource como sua fonte de dados. Configure o ObjectDataSource para usar a EmployeesBLL classe com o SelectMethod definido como GetEmployeesByHiredDateMonth(month).

Usar a classe EmployeesBLL

Figura 6: Usar a EmployeesBLL classe (Clique para exibir a imagem em tamanho real)

Selecione Do método GetEmployeesByHiredDateMonth(month)

Figura 7: Selecione Do GetEmployeesByHiredDateMonth(month) método (Clique para exibir a imagem em tamanho real)

A tela final nos pede para fornecer a origem month do valor do parâmetro. Como definiremos esse valor programaticamente, deixe a origem do parâmetro definida como a opção padrão Nenhum e clique em Concluir.

Deixe a origem do parâmetro definida como Nenhum

Figura 8: Deixe o parâmetro Source Set como None (Clique para exibir a imagem em tamanho real)

Isso criará um Parameter objeto na coleção objectDataSource SelectParameters que não tem um valor especificado.

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
    OldValuesParameterFormatString="original_{0}"
    SelectMethod="GetEmployeesByHiredDateMonth" TypeName="EmployeesBLL">
    <SelectParameters>
        <asp:Parameter Name="month" Type="Int32" />
    </SelectParameters>
</asp:ObjectDataSource>

Para definir esse valor programaticamente, precisamos criar um manipulador de eventos para o evento objectDataSource Selecting . Para fazer isso, acesse a exibição Design e clique duas vezes em ObjectDataSource. Como alternativa, selecione ObjectDataSource, vá para o janela Propriedades e clique no ícone de raio. Em seguida, clique duas vezes na caixa de texto ao lado do Selecting evento ou digite o nome do manipulador de eventos que você deseja usar.

Clique no ícone relâmpago na janela Propriedades para listar os eventos de um controle web

Figura 9: Clique no ícone relâmpago na janela Propriedades para listar os eventos de um controle da Web

Ambas as abordagens adicionam um novo manipulador de eventos para o evento objectDataSource Selecting à classe code-behind da página. Nesse manipulador de eventos, podemos ler e gravar nos valores de parâmetro usando e.InputParameters[parameterName], em que parameterName é o valor do Name atributo na <asp:Parameter> marca (a InputParameters coleção também pode ser indexada ordinicamente, como em e.InputParameters[index]). Para definir o month parâmetro como o mês atual, adicione o seguinte ao Selecting manipulador de eventos:

protected void ObjectDataSource1_Selecting
    (object sender, ObjectDataSourceSelectingEventArgs e)
{
    e.InputParameters["month"] = DateTime.Now.Month;
}

Ao visitar esta página por meio de um navegador, podemos ver que apenas um funcionário foi contratado este mês (março) Laura Callahan, que está na empresa desde 1994.

Esses funcionários cujos aniversários este mês são mostrados

Figura 10: Os funcionários cujos aniversários deste mês são mostrados (clique para exibir a imagem em tamanho real)

Resumo

Embora os valores dos parâmetros do ObjectDataSource possam normalmente ser definidos declarativamente, sem exigir uma linha de código, é fácil definir os valores de parâmetro programaticamente. Tudo o que precisamos fazer é criar um manipulador de eventos para o evento objectDataSource Selecting , que é acionado antes que o método do objeto subjacente seja invocado e defina manualmente os valores para um ou mais parâmetros por meio da InputParameters coleção.

Este tutorial conclui a seção Relatório Básico. O próximo tutorial inicia a seção Filtragem e cenários de Master-Details, na qual examinaremos técnicas para permitir que o visitante filtre dados e faça drill down de um relatório de master em um relatório de detalhes.

Programação feliz!

Sobre o autor

Scott Mitchell, autor de sete livros do ASP/ASP.NET e fundador da 4GuysFromRolla.com, trabalha com tecnologias da Microsoft Web desde 1998. Scott trabalha como consultor independente, treinador e escritor. Seu último livro é Sams Teach Yourself ASP.NET 2.0 em 24 Horas. Ele pode ser contatado em mitchell@4GuysFromRolla.com. ou através de seu blog, que pode ser encontrado em http://ScottOnWriting.NET.

Agradecimentos Especiais

Esta série de tutoriais foi revisada por muitos revisores úteis. O revisor principal deste tutorial foi Hilton Giesenow. Interessado em revisar meus próximos artigos do MSDN? Nesse caso, solte-me uma linha em mitchell@4GuysFromRolla.com.