Olá pessoal, gostaria de explicar
passo a passo como trabalhar com componente LinkButton dentro do GridView de
forma dinâmica e simples. É preciso ficar atento em alguns detalhes especiais.
Requisito:
Ferramenta:
Visual Studio.NET 2008
Linguagem:
C#.NET
Conhecimento dos
componentes .NET
Explicando a situação
Tenho um aplicativo utilizando AJAX
e tenho um grid sendo exibido na página. Dentro desse grid, tenho um link que
devo clicar para abrir um outro componente .NET chamado TabContainer – segue um
link de um artigo mostrando o TabContainer. [http://aspneti.com/trabalhando+com+o+componente+tabcontainer+722,0.aspx].
Se eu colocar um link na página
normalmente; isto é; <a href=””>, a tela dará refresh em tudo e na
verdade quero apenas abrir um componente específico passando parâmetro do grid
preenchido. Fora que, não quero mostrar na página o parâmetro que está sendo
passado, dessa forma fica mais seguro. Melhor fazer tudo internamente. Espero
que tenha entendido um pouco a explicação, tentei ser mais claro possível.
Código GridView
Segue o código gridview montado.
(Code 1.1)
|
<asp:GridView ID="grdProntuario"
runat="server" Width="170px"
AutoGenerateColumns="false" ShowHeader="false">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:Image ID="imgProntuario"
runat="server"
ImageUrl="~/App_Themes/default/image/cadeado.png"
/>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="Bloqueado"
ItemStyle-ForeColor="White"/>
<asp:BoundField DataField="DocumentoCapturadoId" ItemStyle-ForeColor="White"/>
</Columns>
</asp:GridView>
|
Code 1.1
O code 1.1 mostra apenas o código do
gridview sem maiores detalhes. Uma observação é que coloquei uma imagem
(<asp:image>) no itemTemplate do gridview. Dentro desse itemTemplate, vou
colocar mais um componente chamado LinkButton. Code 1.2.
|
<asp:GridView ID="grdProntuario"
runat="server"
Width="170px"
AutoGenerateColumns="false" ShowHeader="false"
onrowdatabound="grdProntuario_RowDataBound">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:Image ID="imgProntuario"
runat="server"
ImageUrl="~/App_Themes/default/image/cadeado.png"
/>
<asp:LinkButton ID="lnkProntuario"
runat="server"
Text='<%# DataBinder.Eval(Container.DataItem, "Campo1")
%>'
oncommand="lnkProntuario_Command"
CommandArgument='<%# (String)
DataBinder.Eval(Container.DataItem, "Campo1") + "$" +
DataBinder.Eval(Container.DataItem, "Campo2") %>'>
</asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="Bloqueado"
ItemStyle-ForeColor="White"/>
<asp:BoundField DataField="DocumentoCapturadoId"
ItemStyle-ForeColor="White"/>
</Columns>
</asp:GridView>
|
Code 1.2
Note
que depois da imagem adicionei o código (<asp:LinkButton ID="lnkProntuario" runat="server" Text='<%#
DataBinder.Eval(Container.DataItem, "Campo1") %>' oncommand="lnkProntuario_Command"
CommandArgument='<%# (String) DataBinder.Eval(Container.DataItem,
"Campo1") + "$" + DataBinder.Eval(Container.DataItem,
"Campo2") %>'></asp:LinkButton>)
e depois desse código continuei o gridview com
seus campos específicos.
Explicação:
O que aparece no Text do componente
<LinkButton> é o “Campo1” vindo da pesquisa no banco de dados. Para editar o grid, tive que clicar com o
botão direito, acessar as propriedades do gridview e depois acessar o
linkButton. (Imagem 1.1)

Referência: 1.1
Como mostro na referência, cliquei
com o botão direito em cima do gridview; escolhi a opção Edit Template e
escolhi a coluna número [0]. Automaticamente o linkbutton apareceu para ser
editado. (Referência 1.2)

Referência: 1.2
No itemTemplate aberto, cliquei em
cima selecionando o componente e acessar as suas propriedades. Foi exatamente
isso que fiz. O evento ativado foi o onCommand. (Referência 1.3)

Referência: 1.3
Quando eu ativo o onCommand, posso
passar os parâmetros como argumento usando a propriedade CommandArgument. Os
parâmetros de envio vieram também do banco de dados como campos normais do
dataset. (Code 1.3)
|
CommandArgument='<%# (String) DataBinder.Eval(Container.DataItem, "Campo1")
+ "$" + DataBinder.Eval(Container.DataItem, "Campo2") %>'>
|
Code 1.3
No meu caso eu preciso passar dois
campos ao mesmo tempo para o meu código, e com o linkbutton, eu tive que passar
como valor e depois separa com o Split. Veja que coloquei (String) antes dos
dois valores para informar que os dados são do tipo string. O próximo passo é
explicar e mostrar o código C#.NET. Code 1.4
|
protected void
lnkProntuario_Command(object sender, CommandEventArgs e)
{
try
{
string[] cmdArgs =
e.CommandArgument.ToString().Split(new char[] { '$' });
Texto1.Text
= cmdArgs[0].ToString();
Texto2.Text
= cmdArgs[1].ToString();
}
catch
(Exception ex)
{
throw
ex;
}
}
|
Code 1.4
Vendo um pouco sobre o lnkProntuario_Command, declarei um array de string[] pegando o
e.CommandArgument.ToString().Split(new char[]{‘$’}). O e.CommandArgument é o
valor vindo do grid quando clico no linkButton, porém vem tudo junto, por
exemplo: MeuNome$123456.
Preciso agora separar a string concatenada
pelo $ (cifrão). Com o split para separar as duas strings entre o $, fiquei com
a posição zero e posição 1 para exibir no componente TabContainer falado
anteriormente.
Para esse final, basta separar a
posição 0 para um tempo e a posição 1 para outro campo.
Comando para
pegar no momento clicado. Code 1.5
|
e.CommandArgument.ToString().
|
Code 1.5
Comando para
separar a string concatenada. Code 1.6
|
string[] cmdArgs =
e.CommandArgument.ToString().Split(new char[] { '$' });
|
Code 1.6
Comando para
pegar a primeira e segunda posição do array de string. Code 1.7
|
Texto1.Text = cmdArgs[0].ToString();
Texto2.Text = cmdArgs[1].ToString();
|
Code 1.7
Bom, eu fico por aqui, espero ter
ajudado e esclarecido a você leitor, como desenvolver com linkButton dentro do
gridview.