Radio Button no GridView

16/07/2009

Prezados;   Necessito incluir um radio button em um GridView, até ai tudo bem, consegui.   Agora estou com outro problema, identificar após o usuário clicar em um botão se o radio button está selecionado e então pegar agluns dados contidos na linha em que estiver.   Obs.: Colocar um botão na linha ao invés do radio button não resolverá o meu problema, pois teria que incluir vários botões, então achei melhor o radio button.     Segue abaixo o meu código:   código ASP: ------------------------------------------------------------------------------------------------------------   <asp:TemplateField HeaderText = "Selecione" HeaderStyle-CssClass="cabecalho" ItemStyle-CssClass="tb_lvw" ItemStyle-HorizontalAlign="Center"> <ItemTemplate> <asp:Literal ID="Literal1" runat="server"> </asp:Literal> </ItemTemplate> </asp:TemplateField>   Código Vb.Net: ------------------------------------------------------------------------------------------------------------ Protected Sub gvwTurma_RowCreated(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles gvwTurma.RowCreated If e.Row.RowType = DataControlRowType.DataRow Then Dim Literal1 As Literal = DirectCast(e.Row.FindControl("Literal1"), Literal) Literal1.Text = String.Format("<input type='radio' name='Grupo' " & "id='RowID' value='' />", e.Row.RowIndex) End If End Sub
Indemberge Santos

Indemberge Santos

Curtidas 0

Respostas

Luiz Maia

Luiz Maia

16/07/2009

Ola Indemberg, tudo bom?   Primeiramente, vc deve tornar o radiobutton um controle de servidor, colocando o runat=server. Depois vc precisa colocar no valor do RadioButton o valor do ID do registro do banco de dados e não o indice, entendeu?   Depois, quando clicar no botao vc deve fazer um metodo que vare o GridView, pegando a coluna onde esta o controle radiobutton, e usando o FindControl() vc consegue manipular os controles, dai, basta vc verificar qual é o que esta checado (dentro do loop) e entao pegar o valor.   Deu pra entender tudo?     Seria algo assim:   Literal1.Text = String.Format("<input type='radio' name='Grupo' runat='server' id='rbProduto' value='' />",  codProdutoPorExemplo)   Depois, algo assim:   protected void Button1_Click(object sender, EventArgs e) { foreach (GridViewRow row in GridView1.Rows) { RadioButton myRadio = (RadioButton)row.FindControl("rbProduto"); if (muRadio.checked) //aqui vc pega o marcado }     Abraços Att Luiz Maia
GOSTEI 0
Indemberge Santos

Indemberge Santos

16/07/2009

Luiz;   Entendi pefeitamente, só estou tendo dificuldade no código abaixo:   foreach (GridViewRow row in GridView1.Rows) { RadioButton myRadio = (RadioButton)row.FindControl("rbProduto"); if (muRadio.checked) //aqui vc pega o marcado } Eu utilizo constantemente o FOR mas o FOR EACH nunca utilizei, e também não consegui passar o código de C# para vb.Outra dúvida e nessa linha:RadioButton myRadio = (RadioButton)row.FindControl("rbProduto");Não entendi o que vc está fazendo.  Se puder me ajudar, agradeço.Enquanto isso estou tentando...Indemberge
GOSTEI 0
Luiz Maia

Luiz Maia

16/07/2009

Ola Indemberg,   O recurso FindControl é usado para "encontrar" um controle que esta renderizado dentro de outro controle, como é neste caso. Temos um GridView que dentro dele temos os radioButtons.   Então você precisa usar um foreach (para cada) para varrer o GridView e so assim encontrar o registro marcado.   Caso tenha dificuldades nesta implantação, me dê um pouco mais de tempo que posso fazer um exemplo pra você ok?   Abraços Att   Luiz Maia
GOSTEI 0
Indemberge Santos

Indemberge Santos

16/07/2009

Luiz;   Tenho dificuldades sim, pois não entendi como funciona o ForEach.   Indemberge
GOSTEI 0
Luiz Maia

Luiz Maia

16/07/2009

Ola Indemberg, vou fazer um exemplo e te envio assim que estiver pronto, ok? Vou usar o banco de dado AdventureWorks da MS para os teste.   Abraços e ate mais. Att Luiz Maia
GOSTEI 0
Indemberge Santos

Indemberge Santos

16/07/2009

Luiz,   Muito obrigado.   Indemberge
GOSTEI 0
Indemberge Santos

Indemberge Santos

16/07/2009

Luiz;   Fiz o seguinte:   No código ASP: <asp:TemplateField HeaderText = "Selecione" HeaderStyle-CssClass="cabecalho" ItemStyle-CssClass="tb_lvw" ItemStyle-HorizontalAlign="Center"> <ItemTemplate> <asp:RadioButton ID="rbTurma" runat="server" GroupName = "Grupo" /> </ItemTemplate> </asp:TemplateField>   No Vb:   For Each row As GridViewRow In gvwTurma.Rows Dim myRadio As RadioButton = DirectCast(row.FindControl("rbTurma"), RadioButton) If myRadio.Checked Then vCodTurma = gvwTurma.Rows(vLinhaGrid).Cells(3).Text vAnoLetivo = gvwTurma.Rows(vLinhaGrid).Cells(4).Text vSequencia = gvwTurma.Rows(vLinhaGrid).Cells(5).Text vStatus = gvwTurma.Rows(vLinhaGrid).Cells(6).Text vCodCurso = gvwTurma.Rows(vLinhaGrid).Cells(7).Text End If vLinhaGrid = vLinhaGrid + 1 Next Funcionou, só que posso selecionar mais de um radiobutton, como faço para que o usuário selecione apenas um radiobutton?
GOSTEI 0
Luiz Maia

Luiz Maia

16/07/2009

Oi Indemberg, tente algo do tipo:   Protected Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowDataBound   dim r as radiobutton r=e.row.findcontrol("radiobutton1") r.GroupName = "NomeDoGrupo"   End Sub   Acho que isto irá resolver, o problema é na renderização do radiobutton dentro do gridview que gera nomes diferentes para o groupname. Setando o groupname dentro do rowdatabound deve dar certo. Att Luiz Maia
GOSTEI 0
Indemberge Santos

Indemberge Santos

16/07/2009

Luiz;   Não resolveu, ainda posso selecionar mais de um radio no meu grid.   Indemberge
GOSTEI 0
Luiz Maia

Luiz Maia

16/07/2009

Indemberg, fiz aqui de duas formas, vc escolhe, acho que a segunda é a melhor:     1 - Escrevendo o controle direto na HTML:   protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { Label rd = e.Row.FindControl("lbTeste") as Label; rd.Text = "<input type='radio' runat='server' name='rbTeste' id='rbTeste'>"; } }   <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="COD_RSS" DataSourceID="SqlDataSource1" onrowdatabound="GridView1_RowDataBound"> <Columns> <asp:CommandField ShowSelectButton="True" /> <asp:BoundField DataField="COD_RSS" HeaderText="COD_RSS" InsertVisible="False" ReadOnly="True" SortExpression="COD_RSS" /> <asp:BoundField DataField="DSC_NOME" HeaderText="DSC_NOME" SortExpression="DSC_NOME" /> <asp:BoundField DataField="DSC_LINK" HeaderText="DSC_LINK" SortExpression="DSC_LINK" /> <asp:TemplateField> <ItemTemplate> <asp:Label ID="lbTeste" runat="server"></asp:Label> </ItemTemplate> </asp:TemplateField> </Columns> <SelectedRowStyle BackColor="#FFCC66" /> </asp:GridView> 2 - Usando o proprio controle do GridView:   Clique na aba do grid view e marque a opção "Enable Selection". Nas propriedades do GridView, muda a cor da linha selecionada trocando a propriedade "SelectRowStyle", mude o "BackColor". Vc tem opção de trocar o texto do Selection tb e ate colocar imagem.   A aparencia fica desta forma:       Espero ter ajudado. Abraços   Att Luiz Maia          
GOSTEI 0
Indemberge Santos

Indemberge Santos

16/07/2009

Até aí tudo bem, trocamos um literal por uma label, e agora como faço para localicar o meu option button e saber se ele está marcado?   Segue código que utilizo abaixo (aqui utilizo um checkbox): For Each row As GridViewRow In gvwTurma.Rows    Dim myCheckbox As CheckBox = DirectCast(row.FindControl("chkTurma"), CheckBox)    If myCheckbox.Checked Then         vCodTurma = gvwTurma.Rows(vLinhaGrid).Cells(3).Text         vAnoLetivo = gvwTurma.Rows(vLinhaGrid).Cells(4).Text         vSequencia = gvwTurma.Rows(vLinhaGrid).Cells(5).Text         vStatus = gvwTurma.Rows(vLinhaGrid).Cells(6).Text         vCodCurso = gvwTurma.Rows(vLinhaGrid).Cells(7).Text   End If   vLinhaGrid = vLinhaGrid + 1 Next   Indemberge
GOSTEI 0
Luiz Maia

Luiz Maia

16/07/2009

Use o segundo exemplo, não tem como não? Caso precise no radio button mesmo, me diga que tento fazer uma solução aqui, ok?   Aguardo Att Luiz Maia
GOSTEI 0
Indemberge Santos

Indemberge Santos

16/07/2009

Luiz;   Colocar um radio no gridview de forma que apenas um radio seja selecionado isso nós já tinhamos conseguido, eu estava usando um literal e na propridade text dele colocava o radio button, funciona.   O problema é que eu não sei como localizar o radio que está dentro do literal (ou label) na propriedade text, pra saber se ele foi selecionado, entendeu?   Na linha abaixo (Vb.Net) estamos localizando o radiobutton que está no gridview, sendo que aqui ele não está dentro da propriedade text do literal ou da label.   Dim myradio As RadioButton = DirectCast(row.FindControl("rbTurma"),RadioButton) Como ficaria essa linha se ele estivesse na propriedade text do literal ou do label?     Obrigado.   Indemberge
GOSTEI 0
Luiz Maia

Luiz Maia

16/07/2009

Ola Indemberg,   Fiz usando javascript, ok? Segue codigo:   using System; using System.Configuration; using System.Data; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Xml.Linq; public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { string cod = Convert.ToString("" + DataBinder.Eval(e.Row.DataItem, "cod_rss")); Label lbRadio = e.Row.FindControl("Label1") as Label; lbRadio.Text = "<input type='radio' name='rdTeste' id='rdTeste' onclick='javascript=Setar(this);' runat='server' value='" + cod + "'>"; } } protected void Button1_Click(object sender, EventArgs e) { Label2.Text = hdValor.Value; } }   E no HTML:   <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>Untitled Page</title> <script language="javascript"> function Setar(obj) { if (obj.value != "") { document.getElementById("hdValor").value = obj.value; } } </script> </head> <body> <form id="form1" runat="server"> <div> <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="COD_RSS" DataSourceID="SqlDataSource1" onrowdatabound="GridView1_RowDataBound"> <Columns> <asp:BoundField DataField="COD_RSS" HeaderText="COD_RSS" InsertVisible="False" ReadOnly="True" SortExpression="COD_RSS" /> <asp:BoundField DataField="DSC_NOME" HeaderText="DSC_NOME" SortExpression="DSC_NOME" /> <asp:BoundField DataField="DSC_LINK" HeaderText="DSC_LINK" SortExpression="DSC_LINK" /> <asp:TemplateField> <ItemTemplate> <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label> </ItemTemplate> </asp:TemplateField> </Columns> </asp:GridView> <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:luizmaia_CvSistemasConnectionString %>" SelectCommand="SELECT * FROM [RSS]"></asp:SqlDataSource> <br /> <asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="recuperar valor selecionado na radio" /> &nbsp;<asp:Label ID="Label2" runat="server" Text="Label"></asp:Label> </div> <input type="hidden" id="hdValor" name="hdValor" value="" runat="server" /> </form> </body> </html>   Me avise qualquer dúvida. Abraços Att Luiz MAia
GOSTEI 0
Indemberge Santos

Indemberge Santos

16/07/2009

Luiz;   Muito obrigado!   Amanhã estarei trabalhando em outro módulo do sistema e provavelmente levarei alguns dias para retornar para este problema, então irei testar esta solução depois.   A rotina que precisava está funcionando com um checkbox, pois atualmente no grid só possui uma opção, então até o início do ano que vem o chekbox me atende...   Devo retomar segunda-feira a rotina de impressão de relatórios através do Report Viewer, abro outro chamado ou continuamos no que estávamos?   Um abraço,   Indemberge
GOSTEI 0
Luiz Maia

Luiz Maia

16/07/2009

Como é outro assunto, vc deve abrir outro chamado ok? Abraços e precisando de qualquer coisa, estamos a sua disposição.   Att Luiz Maia
GOSTEI 0
POSTAR