Posts
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
17/07/2009
Indemberge Santos
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
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
20/07/2009
Indemberge Santos
Luiz;
Tenho dificuldades sim, pois não entendi como funciona o ForEach.
Indemberge
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
20/07/2009
Indemberge Santos
Luiz,
Muito obrigado.
Indemberge
21/07/2009
Indemberge Santos
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?
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
21/07/2009
Indemberge Santos
Luiz;
Não resolveu, ainda posso selecionar mais de um radio no meu grid.
Indemberge
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
22/07/2009
Indemberge Santos
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
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
23/07/2009
Indemberge Santos
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
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" />
<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
23/07/2009
Indemberge Santos
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