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

por Scott Mitchell

Baixar o aplicativo de exemplo ou baixar PDF

Neste tutorial, veremos como adicionar 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 de forma declarativa para os métodos de ObjectDataSource. Se o valor do parâmetro for embutido em código, vier de um controle da Web na página ou em qualquer outra fonte que possa ser lida por uma fonte de dados Parameter objeto, por exemplo, esse valor poderá ser associado ao parâmetro de entrada sem escrever uma linha de código.

No entanto, pode haver ocasiões em que o valor do parâmetro venha de alguma fonte que ainda não tenha sido contada por um dos objetos da fonte de dados interna Parameter. Se o nosso site tiver suporte para 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 do ObjectDataSource.

Sempre que o método Select do ObjectDataSource é invocado, o ObjectDataSource primeiro levanta seu evento de seleção. O método do objeto subjacente do ObjectDataSource é invocado. Depois de concluir o evento selecionado do ObjectDataSource, acionado (a Figura 1 ilustra essa sequência de eventos). Os valores de parâmetro passados para o método do objeto subjacente do ObjectDataSource podem ser definidos ou personalizados em um manipulador de eventos para o evento Selecting.

os eventos do ObjectDataSource selecionado e de seleção são acionados antes e depois que o método do objeto subjacente é invocado

Figura 1: os eventos de Selected e Selecting do ObjectDataSource são acionados antes e depois que o método do objeto subjacente é invocado (clique para exibir a imagem em tamanho normal)

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

Vamos começar!

Etapa 1: adicionando um método aEmployeesTableAdapter

Para nosso primeiro exemplo, precisamos adicionar um meio para recuperar os funcionários cujos HireDate ocorreram em um mês especificado. Para fornecer essa funcionalidade de acordo com nossa arquitetura, precisamos primeiro criar um método em EmployeesTableAdapter que seja mapeado para a instrução SQL apropriada. Para fazer isso, comece abrindo o DataSet tipado Northwind. Clique com o botão direito do mouse no rótulo EmployeesTableAdapter e escolha Adicionar consulta.

adicionar uma nova consulta ao EmployeesTableAdapter

Figura 2: adicionar uma nova consulta à EmployeesTableAdapter (clique para exibir a imagem em tamanho normal)

Escolha Adicionar uma instrução SQL que retorna linhas. Quando você atingir a tela especificar uma SELECT instrução, a instrução de SELECT padrão para o EmployeesTableAdapter já será carregada. Basta adicionar na cláusula WHERE: WHERE DATEPART(m, HireDate) = @Month. Datepart é uma função T-SQL que retorna uma parte de data específica de um tipo de datetime; Nesse caso, estamos usando DATEPART para retornar o mês da coluna HireDate.

retornar apenas as linhas em que a coluna HireDate é menor ou igual ao parâmetro @HiredBeforeDate

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

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

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

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

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

os novos métodos aparecem no Design Surface do conjunto de um

Figura 5: os novos métodos aparecem na design Surface do conjunto dedatas (clique para exibir a imagem em tamanho normal)

Etapa 2: adicionando o método deGetEmployeesByHiredDateMonth(month)à 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 para a DAL para recuperar os funcionários contratados antes de uma data especificada. Abra o arquivo EmployeesBLL.cs 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) simplesmente chama a DAL e retorna 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 à página ProgrammaticParams.aspx na pasta BasicReporting e adicione uma nova ObjectDataSource como sua fonte de dados. Configure o ObjectDataSource para usar a classe EmployeesBLL com a SelectMethod definida como GetEmployeesByHiredDateMonth(month).

usar a classe EmployeesBLL

Figura 6: usar a classe EmployeesBLL (clique para exibir a imagem em tamanho normal)

selecionar do método GetEmployeesByHiredDateMonth (mês)

Figura 7: selecione no método de GetEmployeesByHiredDateMonth(month) (clique para exibir a imagem em tamanho normal)

A tela final solicita que possamos fornecer a origem do valor do parâmetro de month. Como vamos definir esse valor programaticamente, deixe a origem do parâmetro definida como a opção None padrão e clique em concluir.

deixar a origem do parâmetro definida como None

Figura 8: Deixe a origem do parâmetro definida como nenhum (clique para exibir a imagem em tamanho normal)

Isso criará um objeto Parameter na coleção de SelectParameters do ObjectDataSource 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 de Selecting do ObjectDataSource. Para fazer isso, vá para a modo de exibição de Design e clique duas vezes em ObjectDataSource. Como alternativa, selecione o ObjectDataSource, vá para o janela Propriedades e clique no ícone de raio. Em seguida, clique duas vezes na caixa de texto ao lado do evento Selecting ou digite o nome do manipulador de eventos que você deseja usar.

Clique no ícone de raio na janela Propriedades para listar os eventos de um controle da Web

Figura 9: clique no ícone de raio na janela Propriedades para listar os eventos de um controle da Web

Ambas as abordagens adicionam um novo manipulador de eventos para o evento de Selecting do ObjectDataSource à 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 atributo Name na marca de <asp:Parameter> (a coleção de InputParameters também pode ser indexada no ordinal, como no e.InputParameters[index]). Para definir o parâmetro month para o mês atual, adicione o seguinte ao manipulador de eventos Selecting:

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 neste mês (março) Laura Callahan, que foi a empresa desde 1994.

os funcionários cujos aniversários são mostrados neste mês

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

Resumo

Embora os valores dos parâmetros de ObjectDataSource possam ser normalmente definidos declarativamente, sem a necessidade de 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 Selecting do ObjectDataSource, que é acionado antes de o método do objeto subjacente ser invocado e definir manualmente os valores de um ou mais parâmetros por meio da coleção InputParameters.

Este tutorial conclui a seção de relatório básico. O próximo tutorial inicia a seção filtragem e cenários mestre-detalhes, na qual veremos as técnicas para permitir que o visitante filtre os dados e faça uma busca detalhada de um relatório mestre em um relatório de detalhes.

Boa programação!

Sobre o autor

Scott Mitchell, autor de sete livros sobre ASP/ASP. net e fundador da 4guysfromrolla.com, tem trabalhado com tecnologias Web da Microsoft desde 1998. Scott trabalha como consultor, instrutor e escritor independentes. Seu livro mais recente é que a Sams ensina a ASP.NET 2,0 em 24 horas. Ele pode ser acessado em mitchell@4GuysFromRolla.com. ou por meio de seu blog, que pode ser encontrado em http://ScottOnWriting.NET.

Agradecimentos especiais a

Esta série de tutoriais foi revisada por muitos revisores úteis. O revisor de Lead para este tutorial foi Hilton Giesenow. Está interessado em revisar meus artigos futuros do MSDN? Em caso afirmativo, solte-me uma linha em mitchell@4GuysFromRolla.com.