Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

mr.Guardião

Erro em User Control

Recommended Posts

Olá pessoal,

 

Faz pelo menos uns 3 anos que não mexo com .net

E agora surgiu um projeto para dar manutenção.

 

Porém preciso fazer algo muito simples de imediato.

Mas no entanto estou com um problema para compilar o projeto.

 

Está dando um erro na seguinte Sub

Private Sub BindResultadoBusca(ByRef drResultadoBusca As IDataReader) _
Handles DivBuscaNoticias1.BuscaEfetuada

		' Trata a busca efetuada pelo usuário através do bloco de busca

		' Esconder a tabela que exibe a íntegra da notícia
		tabIntegraNoticia.Visible = False


		' Definir sub-título como resultado da busca.
		Tdlistagemnoticias1.lblSubTitulo.Text = " <br>Resultado da busca<br>"

		' Fazer o bind com o data list
		Tdlistagemnoticias1.dlistNoticias.DataSource = drResultadoBusca
		Tdlistagemnoticias1.dlistNoticias.DataBind()
		drResultadoBusca.Close()

		' Verificar se o data list contém algum registro
		If Tdlistagemnoticias1.dlistNoticias.Items.Count > 0 Then
				' Contém; exibir o data list.
				Tdlistagemnoticias1.dlistNoticias.Visible = True
				Tdlistagemnoticias1.lblMensagemRetornoBusca.Visible = False
				Tdlistagemnoticias1.lblSubTitulo.Visible = True
		Else
				' Não contém; exibir mensagem para o usuário e esconder o data list.
				' RN2.1.1.FR1.2
				' Exibir mensagem informativa ao usuário se nenhuma notícia tiver sido encontrada de acordo com os critérios definidos pelo usuário.
				Tdlistagemnoticias1.lblMensagemRetornoBusca.Text = " <br> <br>Nenhuma notícia encontrada."
				Tdlistagemnoticias1.lblMensagemRetornoBusca.Visible = True
				Tdlistagemnoticias1.lblSubTitulo.Visible = False
				Tdlistagemnoticias1.dlistNoticias.Visible = False
		End If

		' Exibir a td de listagem de notícias
		Tdlistagemnoticias1.Visible = True

End Sub

O Erro é o seguinte:

'Sao_Bernardo.tdListagemNoticias.Protected Dim WithEvents lblSubTitulo As System.Web.UI.WebControls.Label' is not accessible in this context because it is 'Protected'.	D:\DOTNET\Projects\___LIXO\Sao_Bernardo\sbe1_Noticias\IntegraNoticia.aspx.vb	95	13	D:\...\Sao_Bernardo\

o conteúdo da tdListagemNoticias é o seguinte:

Arquivo: tdlistagemnoticias.ascx

<%@ Control Language="vb" AutoEventWireup="false" Inherits="Sao_Bernardo.tdListagemNoticias" CodeFile="tdListagemNoticias.ascx.vb" %>
<td width="560">
	<asp:Label id="lblSubTitulo" CssClass="comuns_titulo_sub_area" runat="server"></asp:Label>
	<asp:Label id="lblMensagemRetornoBusca" CssClass="noticias_titulo_lista" runat="server"></asp:Label>
	<asp:datalist id="dlistNoticias" runat="server">
		<ItemTemplate>
			<p class="noticias_titulo_lista">
				<!-- ID2.1.1.1.3 e ID2.2.1.1.3 - Data da notícia -->
				<span class="noticias_data_lista">
					<asp:Label id="lblDataNoticia" runat="server" Text='<%# Container.DataItem("Data").ToShortDateString()%>'/>
				</span>
				<!-- ID2.1.1.1.1 e ID2.2.1.1.1 - Título da notícia -->
				<!-- RN2.1.1.CD1.2 e RN2.2.1.CD1.2 -->
				<!-- O título de cada notícia deve ser um link para a visualização de sua íntegra. -->
				<!-- O link deve levar a AT2.3 - Sistema apresenta a íntegra da notícia selecionada e bloco de busca. -->
				<br>
				<a href='IntegraNoticia.aspx?IDNoticia=<%# Container.DataItem("IDNoticia")%>'>
					<asp:Label id="lblTituloNoticia" runat="server" Text='<%# Container.DataItem("Titulo")%>'/>
				</a>
			</p>
			<p class="noticias_lead_lista">
				<!-- ID2.1.1.1.2 e ID2.2.1.1.2 - Lead da notícia -->
				<asp:Label id="lblLeadNoticia" runat="server" Text='<%# Container.DataItem("Lead")%>'/>
			</p>
		</ItemTemplate>
	</asp:datalist>
</td>

 

Arquivo: tdlistagemnoticias.ascx.vb

Namespace Sao_Bernardo

	Partial Class tdListagemNoticias
		Inherits System.Web.UI.UserControl

#Region " Web Form Designer Generated Code "

		'This call is required by the Web Form Designer.
		<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()

		End Sub


		Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
			'CODEGEN: This method call is required by the Web Form Designer
			'Do not modify it using the code editor.
			InitializeComponent()
		End Sub

#End Region

		Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
			'Put user code to initialize the page here
		End Sub

	End Class

End Namespace

 

Alguém sabe porque tá dando este erro.

Lembro que este projeto inicialmente foi desenvolvido no Visual Studio 2003 e estou tentando executá-lo no Visual Studio 2005

alguns outros erro eu consegui resolver, tipo, classe de envio de e-mail e também a forma de chamar os AppSettings

Mas isto está me dando dor de cabeça.

 

Se alguém puder me ajudar, fico agradecido

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você está tentando acessar um controle do User Control através de uma página, você não vai poder fazer isso. Quando você coloca um controle em uma página ou user control, aquele controle é definido como protected, só o user control e quem herdar dele vai poder alterar seu valor. Recomendo que você crie uma sub publica dentro do code-behind do seu user control e chame ela no code-behind de sua página, essa sub será responsável por alterar o text do label.

 

Movido de Plataforma .Net para Web Applications

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara,

 

eu entendi mais ou menos o que você quis dizer...

Aliás eu descobri que os arquivos que estavam no projeto estavam desatualizados

 

E agora estou com os novos.

Aparentemente continua o erro, porém mudou de posição.

 

Veja:

Arquivo: tdListagemNoticias.ascx.vb

Namespace Sao_Bernardo

	Partial Class tdListagemNoticias
		Inherits System.Web.UI.UserControl

#Region " Web Form Designer Generated Code "
		'This call is required by the Web Form Designer.
		<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()

		End Sub
		Public WithEvents lblMensagemRetornoBusca As System.Web.UI.WebControls.Label
		Public WithEvents dlistNoticias As System.Web.UI.WebControls.DataList
		Public WithEvents lblSubTitulo As System.Web.UI.WebControls.Label

		'NOTE: The following placeholder declaration is required by the Web Form Designer.
		'Do not delete or move it.
		Private designerPlaceholderDeclaration As System.Object

		Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
			'CODEGEN: This method call is required by the Web Form Designer
			'Do not modify it using the code editor.
			InitializeComponent()
		End Sub

#End Region

		Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
			'Put user code to initialize the page here
		End Sub

	End Class

End Namespace

A mensagem que dá agora, estão nestas linhas:

Public WithEvents lblMensagemRetornoBusca As System.Web.UI.WebControls.Label
Public WithEvents dlistNoticias As System.Web.UI.WebControls.DataList
Public WithEvents lblSubTitulo As System.Web.UI.WebControls.Label

Mensagem de Erro:

Error 9 'lblMensagemRetornoBusca' is already declared as 'Protected Dim WithEvents lblMensagemRetornoBusca As System.Web.UI.WebControls.Label' in this class.

 

Também tem algumas páginas que estão fazendo esta chamada:

Protected WithEvents divBuscaNoticias1 As divBuscaNoticias
Protected WithEvents tdListagemNoticias1 As tdListagemNoticias

Mas gera este erro:

Error 18 Type 'tdListagemNoticias' is not defined.

 

Será que você poderia colocar um exemplo simples de como devo resolver isto?

Engraçado que são somente estas páginas que estão dando erro... outra que utilizam UserControl também não dá erro.

Só porque é justamente onde preciso mexer. :o(

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara acho que é o mesmo erro de antes.

Você não consegue acessar um objeto protected de outro objeto só se ele estivesse herdando o primeiro.

Isso que está acontecendo, você nao vai conseguir acessar um controle declarado como protected que está em uma pagina de outra página.

 

Como o Oenning disse você precisa criar um método publico dentro desse user control para conseguir ter acesso a ele...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara... faz 3 anos que não mexo em .net

Então nem me lembro o que fazer nisto...

 

Porque eu alterei o objeto de Protected para Public e não rolou...

Digo alterar estas linhas

 

Public WithEvents lblMensagemRetornoBusca As System.Web.UI.WebControls.Label
Public WithEvents dlistNoticias As System.Web.UI.WebControls.DataList
Public WithEvents lblSubTitulo As System.Web.UI.WebControls.Label

você teria algum link com exemplo... porque as outras páginas que tem UserControl porém elas não geram nada vindo de banco de dados.

Esta página é a única que retorna informações do banco de dados.

 

Valeu...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nossa brodi agora qui eu vi...

Os controles que você ta tentando alterar estão dentro de um datalist....

Dai seguinte, acho que funciona da mesma forma que para um repeater....

Declara esse datalist public e faz um foreach percorrendo os items dele, dai com a função findcontrol você pega os controles que estão dentro dele!

 

Saco a idéia?

item.FindControl("idDoMarvado");

 

Tu vai ter que altera sua sub um pouco....

 

 

Abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Em todos são DataList

Tem uma Label também

 

Tem como você fazer um exemplo para ver se descubro onde está joça está errada.

 

O que tenho é o seguinte.

 

Arquivo: Noticias.aspx

Arquivo: tdListagemNoticias.ascx

 

Dentro de Noticias.aspx, chamamos o tdListagemNoticias.ascx

<%@ Register TagPrefix="uc1" TagName="tdListagemNoticias" Src="tdListagemNoticias.ascx" %>

 

E no tdListagemNoticias.ascx por sua vez temos:

<asp:Label id="lblSubTitulo" CssClass="comuns_titulo_sub_area" runat="server"></asp:Label>

<asp:Label id="lblMensagemRetornoBusca" CssClass="noticias_titulo_lista" runat="server"></asp:Label>

 

O que acontece é que no arquivo Noticias.aspx.vb

Logo no PageLoad tem:

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
	If Not IsPostBack Then

		TdListagemNoticias1.lblSubTitulo.Text = " <br>Notícias Recentes<br>"
		TdListagemNoticias1.lblSubTitulo.Visible = True

	End If
End Sub

Veja que logo de cara já tem esta linha: TdListagemNoticias1.lblSubTitulo.Text = " <br>Notícias Recentes<br>"

A qual já dá o erro que tanto está incomodando.

 

É relativamente algo simples, olhando assim... deveria funcionar... ou não?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal

Achei um link que explica exatamente o que estou fazendo porém, nem seguindo a risca o que é dito... a "penga" funciona.

 

gostaria que quem puder dar uma ajudinha... acessasse o link:

http://www.linhadecodigo.com.br/Artigo.aspx?id=277

 

Lendo a partir de Interceptando User Control

 

O erro que gera é exatamente o erro que estou com problemas no meu projeto.

Se quiserem conferir o projeto que montei (seguindo o modelo deste site)

 

www.revistadointerior.com.br/dotnet/website1.zip

 

Desde já agradeço qualquer ajuda quer vier.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Conforme já havia comentado, é incorreto acessar um componente do user control diretamente.

Cria um sub no seu code-behind do user control que recebe por parâmetro o título e seta no label dentro dele mesmo.

Ou então faça conforme o exemplo do Ramon (link que você passou), criando propriedades.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.