Pergunta

Eu sou novo para usercontrols, tendo um só criou até agora, então paciência comigo. Estive lendo hoje que usercontrols é suposto ser auto-suficiente e não depender de qualquer informação do contêiner pai. Eu recebo essa parte, mas o que eu estou tendo dificuldade para entender é o caminho "certo" para projetar o meu programa em torno esse princípio.

Estou fazendo um formulário web em C #, em que há uma página com um usercontrol nessa página. Eu fiz o usercontrol em seu arquivo ascx e arrastou-o em minha página aspx. O usercontrol é uma data casal caixas e um gridview para mostrar os resultados de um procedimento armazenado SQL.

Eu realmente gostaria de reutilizar esse controle, mas não consigo descobrir como "dizer" o usercontrol o procedimento armazenado Eu gostaria de correr para a página específica Estou sem violar o "don' t contar com a regra recipiente pai".

Graças

Foi útil?

Solução

Não confie no recipiente pai não significa que você não pode se comunicar. Expor uma propriedade no controle de usuário que o pai vai definir. Mas ter um valor padrão para que ele não falhar.

Além disso, se este é um controle muito específico, não há nenhuma razão seria ruim para contar com o pai. Pode não ser ideal, mas você estaria usando o controle de usuário para fornecer uma separação de código.

Outras dicas

Seu controle não precisa saber onde ele está dados vieram. Ela não precisa de saber sobre o procedimento armazenado ou qualquer outra coisa. Tudo o que precisa saber é os dados de que necessita para mostrar. Se eu entender o seu direito de controle, é uma grade com alguns filtros de data. Ele vai receber dados, mostram que os dados e filtrá-la por data. Isso é bom, tudo o que precisa saber é os dados de que necessita para mostrar e e talvez uma data de início padrão e fim do pai.

Você está perdendo o verdadeiro poder de controles de usuário se você não permitir que ele se comunique com o seu pai. Eu acho que você pode estar tomando encapsulamento um pouco longe demais neste caso.

Suponha que você tenha um controle de usuário que é apenas uma tabela ou uma gridview de vários dados do usuário. Inevitavelmente que o controle usuário está indo para necessidade de saber sobre o identificador exclusivo do usuário, a fim de puxá-lo de dados de onde quer que seja, que de forças do curso que você faça uma propriedade pública que a página pai pode definir.

Além disso, mantenha em mente que haverá momentos em que uma ação dentro de necessidades de controle do usuário para desencadear uma ação sobre o pai. delegados de evento entram em jogo aqui, e eles são extremamente útil e, na minha opinião, os controles de fazer o usuário ainda mais útil.

Basta soltar toda a idéia sobre controles de usuário e os pais não falar e para trás, e você vai encontrar coisas muito mais fácil.

Então você tem algumas coisas dentro deste controle de usuário que irá vincular a um conjunto de dados que é retornado pelo procedimento armazenado?

Aqui está uma maneira de lidar com isso: Em vez de tentar comunicar o procedimento armazenado para o controle de usuário, fazer o conjunto de dados que o controle de usuário irá confiar em uma propriedade pública do controle de usuário.

Durante a execução, o código que está fora do controle de usuário irá executar o procecure apropriado armazenado, e defina a propriedade conjunto de dados em seu controle de usuário para o resultado retornado pelo proc armazenado.

Como toda a gente apontou, as suas necessidades de controle do usuário para ter uma forma padrão de comunicar as suas intenções e comportamentos. Isso não significa que você tem que ter uma referência para o contêiner, e, portanto, saber o que (MyPage.aspx) realmente contém.

A única coisa que eu achei indispensável ao trabalhar com controles de usuário é eventos. Saiba eventos e como usá-los. Os eventos são uma ótima maneira de se comunicar comportamento.

No seu exemplo, eu posso dividir os seus critérios (data caixas de texto) em seu próprio controle de usuário. Criar uma nova classe que herda de EventArgs, que contém os seus critérios (campos DateTime). Quando procurar o usuário clica, acionar um evento (do tipo EventHandler<YourEventArgs>) com o seu EventArgs personalizado. A página irá manipular o evento, consulta o banco de dados e, em seguida, passar os resultados para um público ou método interno em seu segundo controle de usuário, que exibe os registros.

A chave aqui, seu controle critérios podem ser reutilizados em diferentes páginas se você tiver a necessidade de chamar diferentes procedimentos armazenados. Pense inserção vs cenários de atualização. Muitas vezes, os elementos de interface do usuário são os mesmos. Você pode criar um controle e usá-lo em duas páginas diferentes com dois comportamentos diferentes (AddRecord.aspx e UpdateRecord.aspx). Além disso, o controle que exibe registros é muito facilmente reutilizados.

Uma grande vantagem é que suas páginas e controles tornam-se bastante pequeno. Cada controle / página é realmente apenas preocupado com o seu pequeno subconjunto de funcionalidade. Seu código se tornará menos assustador e mais fácil de manter.

"dizer" o usercontrol qual o procedimento que eu gostaria de executar armazenados

Parece que você está procurando eventos / delegados
Tem o controle expor um evento, e deixar que o pai adicionar um manipulador (talvez no construtor, se você quiser para forçá-lo a adicionar um e somente um evento)
Alternativamente, você poderia usar padrão Command / Estratégia -. Têm a encapsular pai do método, e enviar o objeto de encapsulamento para o controle em seu construtor

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top