Ir para conteúdo

Arquivado

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

SID_SILVA

[Resolvido] Sobre o RowCommand

Recommended Posts

Ola Amigos

 

Eu estou em duvida sobre o RowDataBound e o RowCommand.

Coloquei um BreakPoint para poder ver exatamente o que acontece.

 

Ja citei outros problemas ligados a isso mas ainda estou com duvida.

 

Pelo que percebi o RowDataBound e executado quando o GridView esta sendo carregado,ou quando a a insercao de uma nova linha,logo quando o Grid esta sendo montado ele e executado "N" vezes, dependendo da quantidade de linhas do gridView.

 

 

O RowCommand e excutado quando um botao por exemplo dentro do grid e executado.

 

Pergunta, alias ate que enfim veio a pergunta.

 

 

Na rotina abaixo, tenho um LinkButtom dentro do Gridview e a propriedade commandName chama-se PegaID.

Entao a execucao do sistema, nao deveria passar por aqui toda vez que eu clicasse no LinkButtom ?

Porque nao e isso o que esta acontecendo.

 

 

Protected Sub GrdDocumentos_RowCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs) Handles GrdDocumentos.RowCommand

Dim IDREL As Double

If e.CommandName = "PegaID" Then

IDREL = Convert.ToDouble(e.CommandArgument)

End If

End Sub

 

Muito Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Deveria, como está seu aspx e seu aspx.cs?

Eu fiz assim e funcionou:

<asp:GridView AutoGenerateColumns="false" ID="GridView1" runat="server" 
	onrowcommand="GridView1_RowCommand">
	<Columns>
		<asp:BoundField DataField="Id" />
		<asp:BoundField DataField="Nome" />
		<asp:TemplateField>
			<ItemTemplate>
				<asp:LinkButton ID="link" Text="Clique Aqui" CommandName="PegaID" CommandArgument='<%# Eval("Id") %>' runat="server"></asp:LinkButton>
			</ItemTemplate>
		</asp:TemplateField>
	</Columns>
</asp:GridView>

Quando eu clicno no LinkButton, ele chama o evento GridView1_RowCommand.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom Dia Amigos

 

Bem parece que o meu problema esta resolvido.

 

quintelab

 

Eu ja utilizei o SelectedButton para outros fins, para esse que eu citei eu nao consegui utiliza-lo por isso tentei usar o LinkButton.

 

 

Oenning

 

O meu HTML esta igual ao seu, depois de tanto quebrar a cabeca com isso, recebi uma dica no forum da Microsoft que falava sobre o "CommandArgument" e o "CommandName".

 

Meu erro no "RowCommand", foi nao ter percebido que eu coloquei o comando no GridView errado e por isso nao estava funcionando, pois eu nunca clico nesse segundo Grid que e o errado.

 

Eu clico no linkbutton do primeiro Grid que tem o registro pai e dai ecoo no segundo Grid os dados do registro filho, a partir do campo ID e agora esta funcionando.

 

Devo ter feito alguma besteira para variar, pois eu ja fiz isso antes usando o SelectedButton.

 

Mas a minha ingenuidade teve um lado positivo, pois agora eu aprendi na marra a usar o RowCommand e o RowDataBound que eu nao havia usado antes, ao menos nao diretamente.

 

Obrigado mais uma vez, um abraco e ate a proxima duvida.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Te digo uma coisa, RowDataBound é seu melhor amigo. Você faz chover com esse evento, quase tudo que você configura em Grids é nele. Valeu!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom Dia Amigos

 

Parece que eu me deixei enganar.

 

Aparentemente eu havia resolvido o meu problema principal que era pegar o campo ID, porem nao sei o que aconteceu mas embora eu ate consiga pega-lo, nao esta ocorrendo exatamente como eu preciso.

 

Como disse, tenho um gridView e criei um template, onde coloquei um LinkButton.Meu objetivo e clicar nesse LinkButton, pegar o ID, com esse ID fazer uma leitura na base de dados pegando as informacoes que me interessam e entao abrir uma janela modal com esse campos pesquisados.

 

Acontece que a janela esta sendo aberta assim que eu clico no LinkButton, ou seja, antes de pegar o ID e fazer a leitura na base de dados, portanto todos os campos estao em branco.

 

 

 

Usei a estrutura que ja havia mencionado, no HTML e no Code Behind :

 

 

 

<ItemTemplate> 


<asp:LinkButton ID="LinkButton1" runat="server" CommandName= "PegaID" CommandArgument='<%#Eval("REL_ID")%>' OnClientClick="openModal('Documentos.aspx', 800, 600);"><%#Eval("REL_DOCUMENTO")%></asp:LinkButton>


</ItemTemplate>

 

 

Protected Sub GrdDocumentos_RowCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs) Handles GrdDocumentos.RowCommand

Dim conexao As SqlConnection

Dim sql As String = ""

If e.CommandName = "PegaID" Then

   Session("IDREL") = Convert.ToDouble(e.CommandArgument)

   SQL = Convert.ToDouble(e.CommandArgument)

End If

End Sub

Somente quando eu fecho a janela que foi aberta e que a execucao do programa vem para ca :

Protected Sub GrdDocumentos_RowCommand... e pega o ID, porem isso tem que ser feito antes.

 

No GridView coloquei :

 

<asp:GridView ID="GrdDocumentos" runat="server" OnRowDataBound ="GrdDocumentos_RowDataBound" OnRowCommand="GrdDocumentos_RowCommand"

 

E agora, o que foi que eu fiz de errado.

 

 

Obrigado e um Abraco

Compartilhar este post


Link para o post
Compartilhar em outros sites

OnClientClick vai executar antes do evento RowCommand. Eu recomendo você passar o ID por GET e fazer essa consulta na outra página.

Fica assim:

OnClientClick="openModal('Documentos.aspx?id=' + <%#Eval("REL_ID")%>, 800, 600);"
Obs.: Posso ter errado na sintaxe acima, mas o resultado é para ser: Documentos.aspx?Id=2, por exemplo.

 

Ai todo o código de consulta você pode fazer no Page_Load.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado mais uma vez Oenning

 

Eu acho que esse ASP.NET ainda vai me deixar maluco, a cada dia surge uma necessidade nova que exige um comando novo.

 

Aqui nesse exemplo corrigido que voce me deu :

 

OnClientClick="openModal('Documentos.aspx?id=' + <%#Eval("REL_ID")%>, 800, 600);"

 

'Documentos.aspx?id (Esse "ID" e o que?.E uma variavel qualquer, cujo valor sera acessado na pagina que sera chamada?)

(E um campo da base de dados?)

 

Eu costumo chamar uma nova pagina, passando parametros atraves do Code Behind, aqui no HTML eu nunca fiz, dai a razao da minha duvida.

E eu nao seu se ai seria o REL_ID, uma vez que o valor dele vem logo a seguir em Eval("REL_ID").

 

 

MUito obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esqueci de dizer.

 

Coloquei assim e nao funcionou.

 

<asp:LinkButton ID="LinkButton1" runat="server" CommandName= "PegaID" CommandArgument='<%#Eval("REL_ID")%>' OnClientClick="openModal('Documentos.aspx?REL_ID=' + <%#Eval("REL_ID")%>, 800, 600);"><%#Eval("REL_DOCUMENTO")%></asp:LinkButton>

 

 

Bo gridView, onde aparece o LinkButton esta aparecendo isso:

 

 

OnClientClick="openModal('Documentos.aspx?REL_ID=' + 13, 800, 600);">4C

 

 

Ou seja, esta aparecendo parte do codigo HTML e no final aparece o valor que realmente deveria aparecer : 4C

 

Acho que o problemas esta nas Aspas ou Apostrofes.Vou verificar.

 

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Existe meio que uma convenção na Web que diz que toda vez que você vai abrir um formulário para Consulta, Edição, Adição, você deve chamar a página usando GET, e quando você vai alterar dados, você usa POST. Por padrão o asp.net usa POST para tudo. O que você está fazendo ali é passar os dados de uma página para outra usando GET, passando o identificar para outra página. Você pega o valor assim:

 

Request.QueryString["id"]
Esse ID pode ser qualquer valor, mas deve ter um significado para você, com ele você deve ser capaz de buscar dados e disponibilzar ao usuário, geralmente acaba sendo a Primary Key da sua tabela.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom Dia Oenning

 

Obrigado novamente por sua ajuda.

 

Eu realmente fiquei em duvida para saber de onde voce havia tirado esse campo "ID", uma vez que o meu e "REL_ID".Imaginei que voce estivesse se referindo a ele de forma generica, pois podemos chama-lo simplesmente de campo ID.

 

Normalmente eu passo apenas o campo ID de uma pagina para outra, ou ate mesmo para a mesma pagina.Entretanto ate agora eu fiz isso apenas atraves do GridView.Para recuperar o dado, eu ja uso o Request.QueryString["id"], sem problemas.

 

Essa foi a primeira vez que eu precisei passar o "ID", atraves do HTML,pelo motivo que citei anteriormente.

 

Eu tenho um gridView com um LinkButton, clicando nesse Link, eu abro uma janela modal, dai preciso pegar esse ID para recuperar os dados do registro.

Como voce disse anteriormente o Evento Click ocorre antes do Row_Command, dai mesmo pegando o ID no evento Row_Command, uma vez que o OnClick, ja foi executado a nova janela e aberta em branco sem os dados, sem que eu tenha a possibilidade de ler a base de dados com o ID pego.

 

Falei demais nao e mesmo?

 

Resumindo, o meu problema esta nessa tal sintaxe abaixo que eu nao consigo acertar.

 

<asp:LinkButton ID="LinkButton1" runat="server" CommandName= "PegaID" CommandArgument='<%#Eval("REL_ID")%>' OnClientClick="openModal('Documentos.aspx?REL_ID=' + <%#Eval("REL_ID")%>, 800, 600);"><%#Eval("REL_DOCUMENTO")%></asp:LinkButton>

 

No Html coloquei isso que esta acima e no grid, ao inves de aparecer o conteudo do campo "REL_DOCUMENTO", aparece isso que esta abaixo:

 

OnClientClick="openModal('Documentos.aspx?REL_ID=' + 13, 800, 600);">4C

 

Ao que parece parte do comando esta aparecendo como parte do link, o que significar Aspas ou Apostrofos no lugar errado.

 

E isso ate que parecia ser tao simples.

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tenta assim:

OnClientClick="openModal('Documentos.aspx?REL_ID=<%#Eval("REL_ID")%>, 800, 600');"
Ah, já que você está usando ClientClick, você não precisa mais usar o CommandName e Argument.

E você pode trocar para HyperLink ao invés de LinkButton.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado novamente Oenning

 

Eu ja estou usando o LinkButton :

 

<asp:LinkButton ID="LinkButton1" . ........

 

Vou tirar esses 2 itens

 

 

Bem, falta pouco para eu resolver esse problema que ao que tudo indica e de sintaxe:

 

[/code]
<asp:LinkButton ID="LinkButton1" runat="server"  OnClientClick="openModal('Documentos.aspx?REL_ID='+12,  800, 600);"  ><%# Eval("REL_DOCUMENTO") %></asp:LinkButton>
[code]

Nessa sequencia : OnClientClick="openModal('Documentos.aspx?REL_ID='+12 (O numero 12, eu coloquei e representa um dos ID´s da minha tabela)

Funcionou perfeitamente, a janela pop Up foi aberta e nessa janela que se abriu eu recuperei o ID passado com o QueryString, logo os campos foram preenchidos com as informacoes devidas.E exatamente isso o que eu quero.

 

O problema continua o mesmo, como colocar essa informacao "<%#Eval("REL_ID")%>" (que corresponde ao ID) no lugar do 12, que eu coloquei manualmente.

 

Continuo tentando descobrir onde estou errando.

 

Aquele exemplo que voce me deu, infelizmente tambem nao funcionou

 

[/code]
OnClientClick="openModal('Documentos.aspx?REL_ID=<%#Eval("REL_ID")%>, 800, 600');"
[code]

 

Obrigado e um Abraco

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom Dia Oenning

 

 

Realmente a sua ajuda tem sido muito preciosa para resolver alguns dos meus problemas.

Fiquei contente quando vi mais esse exemplo que voce me passou mas infelizmente tambem nao funcionou o que e uma pena.

 

Continuo achando que e um problema de aspas ou apostrofes.Pois a sintaxe abaixo funciona perfeitamente.

 

 

<asp:LinkButton ID="LinkButton1" runat="server"  OnClientClick="openModal('Documentos.aspx?REL_ID=13', 800, 600);"> <%# Eval("REL_DOCUMENTO") %> </asp:LinkButton>

O problema como eu disse e que ao inves de aparecer o numero 13 que e o ID, deve aparecer o proprio ID que esta em '<%#Eval("REL_ID")%>'.

 

E agora?

 

Mais uma vez muito obrigado

 

Ola Novamente

 

So para complementar aqui esta a funcao JavaScript que eu estou usando:

 

function openModal(pUrl, pWidth, pHeight) {
	if (window.showModalDialog) {
		return window.showModalDialog(pUrl, window,
		  "dialogWidth:" + pWidth + "px;dialogHeight:" + pHeight + "px");
	} else {
		try {
			netscape.security.PrivilegeManager.enablePrivilege(
			  "UniversalBrowserWrite");
			window.open(pUrl, "wndModal", "width=" + pWidth
			  + ",height=" + pHeight + ",resizable=no,modal=yes");
			return true;
		}
		catch (e) {
			alert("Script não confiável, não é possível abrir janela modal.");
			return false;
		}
	}

Um Abraco

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha, você pode fazer no evento RowDataBound, estou sem VS aqui, então segue rascunho.

 

if (e.Row.RowType == RowType.DataRow)
{
LinkButton link = e.Row.FindControl("LinkButton1");
int id = e.row.Cells[0].Text;
link.OnClientClick = "openModal('Documentos.aspx?REL_ID=" + id + ", 800, 600');";
}

Fazendo no Code-Behind fica mais flexivel trabalhar com essas concatenações

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom Dia Oenning

 

 

Eu fiz uma modificacao aqui :

 

Dim ID1 As Double = DataBinder.Eval(e.Row.DataItem, "REL_ID")

 

Pois a sequencia que voce me enviou nao funcionou.

Me parece que a estrutura esta correta, porem deve haver algum problema com as Aspas e Apostrofes (Meu ponto fraco).

 

Portanto ainda ha algum erro de sintaxe.

 

Vou analisar mais um pouco.

 

Obrigado e um Abraco

Compartilhar este post


Link para o post
Compartilhar em outros sites

Depois que executa esse código do RowDataBoud, veja qual o conteudo do link.OnClientClick.

Uma correção, tente assim:

link.OnClientClick = "openModal('Documentos.aspx?REL_ID=" + id + "', 800, 600);";

Ele esta atribuindo o ID corretamente?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola novamente meu amigo.

 

O ID esta correto.O erro continua na sintaxe da linha abaixo :

 

link.OnClientClick = "openModal('Documentos.aspx?REL_ID=" + ID + "', 800, 600);"

 

 

Protected Sub GrdDocumentos_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GrdDocumentos.RowDataBound

		If (e.Row.RowType = DataControlRowType.DataRow) Then

			Dim link As LinkButton = e.Row.FindControl("LinkButton1")
			Dim ID As Double = DataBinder.Eval(e.Row.DataItem, "REL_ID")

			link.OnClientClick = "openModal('Documentos.aspx?REL_ID=" + ID + "', 800, 600);"

		End If
END SUB

 

De volta para a mesa de cirurgia.

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vai no exibir código fonte da página e veja qual as marcações que o código está gerando, se o ID está sendo impresso corretamente.

Estou achando que o problema não é mais ai...

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.