Compartilhar via


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 em código, 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 de fonte Parameter de dados internos. Se nosso site tiver suporte para contas de usuário, talvez queiramos definir o parâmetro com base na ID de Usuário do visitante conectada no momento. Ou talvez seja necessário personalizar o valor do parâmetro antes de enviá-lo para o método do objeto subjacente do ObjectDataSource.

Sempre que o método Select do ObjectDataSource é invocado, o ObjectDataSource primeiro dispara seu evento Selecting. Em seguida, o método do objeto subjacente do ObjectDataSource é invocado. Após a conclusão, o evento Selecionado do ObjectDataSource é disparado (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 Selecting evento.

Os eventos Selected e Selecting do ObjectDataSource são disparados antes e depois que o método do objeto subjacente é invocado

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

Neste tutorial, examinaremos a adição de um método ao nosso DAL e BLL que aceita um único parâmetro Monthde entrada, de 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: adicionando um método aEmployeesTableAdapter

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

Adicionar uma nova consulta ao EmployeesTableAdapter

Figura 2: Adicionar uma nova consulta à 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 Declaração, a declaração padrão SELECT para o EmployeesTableAdapter já estará carregada. Basta adicionar na cláusula WHERE: 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 ao parâmetro <span class= @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 dos métodos FillBy 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 a imagem em tamanho real)

Clique em Concluir para finalizar o assistente e voltar à área de design do Conjunto de Dados. Agora, o EmployeesTableAdapter 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 projeto 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 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 solicita 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 os nossos outros métodos nesta classe, GetEmployeesByHiredDateMonth(month) simplesmente faz uma chamada ao DAL e retorna os resultados.

Etapa 3: Exibir 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 fonte de dados. Configure o ObjectDataSource para usar a classe EmployeesBLL com SelectMethod definido como GetEmployeesByHiredDateMonth(month).

Usar a classe EmployeesBLL

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

Selecionar a partir do método GetEmployeesByHiredDateMonth(month)

Figura 7: Selecione no 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 None padrão e clique em Concluir.

Deixe a origem do parâmetro definida como Nenhum

Figura 8: Deixe o conjunto de origem do parâmetro como Nenhum (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 do Selecting ObjectDataSource. Para fazer isso, vá para o modo design e clique duas vezes no ObjectDataSource. Como alternativa, selecione o ObjectDataSource, vá para a 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 do Lightning Bolt na janela Propriedades para listar os eventos de um controle da Web

Figura 9: Clique no ícone de raio na janela de Propriedades para listar os eventos de um controle 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], onde parameterName é o valor do atributo Name na tag <asp:Parameter> (a coleção InputParameters também pode ser indexada ordinalmente, como em e.InputParameters[index]). Para definir o month parâmetro para 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 dá início à seção Filtragem e Cenários Master-Details, na qual examinaremos técnicas para permitir que o visitante filtre dados e aprofunde-se de um relatório mestre para um relatório detalhado.

Divirta-se programando!

Sobre o autor

Scott Mitchell, autor de sete livros 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 alcançado em mitchell@4GuysFromRolla.com.

Agradecimentos Especiais a

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? Se assim for, deixe-me uma linha em mitchell@4GuysFromRolla.com.