GridView - Selecionar a linha clicando em qualquer coluna
Boa tarde,
gostaria de saber se ha como selecionar uma linha de um gridview, realçando a cor da mesma, clicando em qualquer posição da linha, ou seja nao utilizar a opção padrão que seria colocando um botão em cada linha e nem deixando cada campo como se fosse um link.
Grato,
Fabricio
Fabricio Santos
Curtidas 0
Respostas
Fabio Mans
23/04/2009
Olá no evendo RowDataBound do seu Grid digite o código abaixo.
Com isso, em qualquer lugar do seu grid quando o usuário passar o mouse irá trocar a cor, escolha a sua cor preferida e troque no backgroundColor.
protected void gvSetor_RowDataBound(object sender, GridViewRowEventArgs e)
{
switch (e.Row.RowType)
{
case DataControlRowType.DataRow:
if (e.Row.RowIndex % 2 == 1)
{
e.Row.Attributes.Add("onmouseout", "this.style.backgroundColor='#F9FFEF'");
}
else
{
e.Row.Attributes.Add("onmouseout", "this.style.backgroundColor='#EAEFE0'");
}
e.Row.Attributes.Add("onmouseover", "this.style.backgroundColor='#dcdcdc'");
break;
}
}
É isso que você precisa?
Fabio.
Com isso, em qualquer lugar do seu grid quando o usuário passar o mouse irá trocar a cor, escolha a sua cor preferida e troque no backgroundColor.
protected void gvSetor_RowDataBound(object sender, GridViewRowEventArgs e)
{
switch (e.Row.RowType)
{
case DataControlRowType.DataRow:
if (e.Row.RowIndex % 2 == 1)
{
e.Row.Attributes.Add("onmouseout", "this.style.backgroundColor='#F9FFEF'");
}
else
{
e.Row.Attributes.Add("onmouseout", "this.style.backgroundColor='#EAEFE0'");
}
e.Row.Attributes.Add("onmouseover", "this.style.backgroundColor='#dcdcdc'");
break;
}
}
É isso que você precisa?
Fabio.
GOSTEI 0
Fabricio Santos
23/04/2009
Boa noite,
funcionou a mudança de cor da linha, mas alem disso também preciso disparar um evento ao clicar em qualquer lugar da linha, se possível também gostaria de mudar o desenho do ponteiro do mouse de setinha para maosinha
Grato
Fabricio
GOSTEI 0
Fabio Mans
23/04/2009
Segue abaixo.
protected void gvwPalavroes_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.DataItemIndex != -1)
{
e.Row.Attributes.Add("onclick", ClientScript.GetPostBackEventReference(gvwPalavroes, "Edit$" + e.Row.RowIndex));
e.Row.Attributes.Add("onMouseover", "this.style.background='#FCF3C4';this.style.cursor='hand'");
//Verifica se a linha é alternada e aplica o estilo
if (e.Row.RowState == DataControlRowState.Alternate)
{
e.Row.Attributes.Add("onMouseout", "this.style.background='#FFFFFF';this.style.cursor='hand'");
}
else
{
e.Row.Attributes.Add("onMouseout", "this.style.background='#F5F2E9';this.style.cursor='hand'");
}
}
}
protected void gvwPalavroes_RowEditing(object sender, GridViewEditEventArgs e)
{
int Codigo = Convert.ToInt32(gvwPalavroes.DataKeys[e.NewEditIndex].Value);
Response.Redirect("Resultado.aspx?id=" + Codigo);
//Aqui vc faz o que precisar, no caso eu estou mandando para outra página, peguei o ID através do DataKeys
}
<asp:GridView ID="gvwPalavroes" runat="server" DataKeyNames="ID" OnRowDataBound="gvwPalavroes_RowDataBound"Width="680px" AutoGenerateColumns="False" OnRowEditing="gvwPalavroes_RowEditing">
<Columns>
<asp:BoundField DataField="Palavrao" HeaderText="Palavrão" SortExpression="Palavrao" />
<asp:CommandField ButtonType="Image" SelectImageUrl="~/Images/Edit.gif" SelectText="Editar palavrão" ShowSelectButton="True">
<ItemStyle HorizontalAlign="Center" Width="20px" />
</asp:CommandField>
<asp:CommandField ButtonType="Image" DeleteImageUrl="~/Images/Delete.gif" DeleteText="Excluir palavrão" ShowDeleteButton="True">
<ItemStyle HorizontalAlign="Center" Width="20px" />
</asp:CommandField>
</Columns>
</asp:GridView>
</ContentTemplate>
</asp:UpdatePanel>
</asp:Content>
Aviso, a "maozinha' não funciona no FireFox.
Espero ter ajudado.
Fabio
protected void gvwPalavroes_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.DataItemIndex != -1)
{
e.Row.Attributes.Add("onclick", ClientScript.GetPostBackEventReference(gvwPalavroes, "Edit$" + e.Row.RowIndex));
e.Row.Attributes.Add("onMouseover", "this.style.background='#FCF3C4';this.style.cursor='hand'");
//Verifica se a linha é alternada e aplica o estilo
if (e.Row.RowState == DataControlRowState.Alternate)
{
e.Row.Attributes.Add("onMouseout", "this.style.background='#FFFFFF';this.style.cursor='hand'");
}
else
{
e.Row.Attributes.Add("onMouseout", "this.style.background='#F5F2E9';this.style.cursor='hand'");
}
}
}
protected void gvwPalavroes_RowEditing(object sender, GridViewEditEventArgs e)
{
int Codigo = Convert.ToInt32(gvwPalavroes.DataKeys[e.NewEditIndex].Value);
Response.Redirect("Resultado.aspx?id=" + Codigo);
//Aqui vc faz o que precisar, no caso eu estou mandando para outra página, peguei o ID através do DataKeys
}
<asp:GridView ID="gvwPalavroes" runat="server" DataKeyNames="ID" OnRowDataBound="gvwPalavroes_RowDataBound"Width="680px" AutoGenerateColumns="False" OnRowEditing="gvwPalavroes_RowEditing">
<Columns>
<asp:BoundField DataField="Palavrao" HeaderText="Palavrão" SortExpression="Palavrao" />
<asp:CommandField ButtonType="Image" SelectImageUrl="~/Images/Edit.gif" SelectText="Editar palavrão" ShowSelectButton="True">
<ItemStyle HorizontalAlign="Center" Width="20px" />
</asp:CommandField>
<asp:CommandField ButtonType="Image" DeleteImageUrl="~/Images/Delete.gif" DeleteText="Excluir palavrão" ShowDeleteButton="True">
<ItemStyle HorizontalAlign="Center" Width="20px" />
</asp:CommandField>
</Columns>
</asp:GridView>
</ContentTemplate>
</asp:UpdatePanel>
</asp:Content>
Aviso, a "maozinha' não funciona no FireFox.
Espero ter ajudado.
Fabio
GOSTEI 0
Fabricio Santos
23/04/2009
Boa Tarde,
a mudança do ponteiro para mãosinha e o realce da cor das celulas esta funcionando bem, so que quando clico na linha me é apresentada o seguinte erro java script:
Detalhes dos erros da página da Web
Agente de Usuário: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30618; OfficeLiveConnector.1.3; OfficeLivePatch.0.0)
Carimbo de data/hora: Fri, 24 Apr 2009 16:34:09 UTC
Mensagem: Sys.WebForms.PageRequestManagerServerErrorException: Argumento de postback ou de retorno de chamada inválido. A validação do evento é habilitada com o uso de <pages enableEventValidation="true"/> na configuração ou <%@ Page EnableEventValidation="true" %> em uma página. Por motivos de segurança, esse recurso verifica se os argumentos para eventos de postback ou de retorno de chamada se originam no controle do servidor que originalmente os processou. Se os dados forem válidos e esperados, use o método ClientScriptManager.RegisterForEventValidation para registrar os dados de postback ou de retorno de chamada para validação.
Linha: 4723
Caractere: 21
Código: 0
URI: http://localhost/SICFin/ScriptResource.axd?d=AOmJwr7qRVSk-jUOFVwQycOjBRI53Dxi1N9GBaXbLbUljMTeI1T5w-nUY7iNeQSPeG27Ak2cCqs_ER61yx2bZT3vbpjX1TqZAuKL7XkNBFc1&t=ffffffffc30b8fab Ja alterei a diretiva page da minha pagina ela esta da seguinte maneira: <%@ Page Title="" Language="C#" MasterPageFile="~/SICFin.master" AutoEventWireup="true" CodeFile="Cadastros.aspx.cs" Inherits="Cadastros_Cadastros" Culture="pt-BR" uiCulture="pt-BR" EnableEventValidation="true" %> Outro detalhe é que estou usando Ajax. Grato, Fabrício
Carimbo de data/hora: Fri, 24 Apr 2009 16:34:09 UTC
Mensagem: Sys.WebForms.PageRequestManagerServerErrorException: Argumento de postback ou de retorno de chamada inválido. A validação do evento é habilitada com o uso de <pages enableEventValidation="true"/> na configuração ou <%@ Page EnableEventValidation="true" %> em uma página. Por motivos de segurança, esse recurso verifica se os argumentos para eventos de postback ou de retorno de chamada se originam no controle do servidor que originalmente os processou. Se os dados forem válidos e esperados, use o método ClientScriptManager.RegisterForEventValidation para registrar os dados de postback ou de retorno de chamada para validação.
Linha: 4723
Caractere: 21
Código: 0
URI: http://localhost/SICFin/ScriptResource.axd?d=AOmJwr7qRVSk-jUOFVwQycOjBRI53Dxi1N9GBaXbLbUljMTeI1T5w-nUY7iNeQSPeG27Ak2cCqs_ER61yx2bZT3vbpjX1TqZAuKL7XkNBFc1&t=ffffffffc30b8fab Ja alterei a diretiva page da minha pagina ela esta da seguinte maneira: <%@ Page Title="" Language="C#" MasterPageFile="~/SICFin.master" AutoEventWireup="true" CodeFile="Cadastros.aspx.cs" Inherits="Cadastros_Cadastros" Culture="pt-BR" uiCulture="pt-BR" EnableEventValidation="true" %> Outro detalhe é que estou usando Ajax. Grato, Fabrício
GOSTEI 0
Fabio Mans
23/04/2009
Tira o Ajax que funciona.
GOSTEI 0
Fabricio Santos
23/04/2009
cara, conegui fazer funcionar com o Ajax, alterei alterei a propriedade EnableEventValidation para false e na sessão pages do web.config ficou assim:
<pages enableEventValidation="false" renderAllHiddenFieldsAtTopOfForm="false">
<controls>
<add tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add tagPrefix="asp" namespace="System.Web.UI.WebControls" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
</controls>
</pages>
Porem, quando clico na linha nao esta disparando o evendo que preparei e sim abrindo para edicao na propria linha do GridView. No meu programa a edicao nao e na linha do gridview e sim num panel que coloco como visivel.
GOSTEI 0
Fabio Mans
23/04/2009
Posta o seu Grid e o código fonte.
GOSTEI 0
Fabricio Santos
23/04/2009
<asp:GridView ID="grdClientes" runat="server" AutoGenerateColumns="False"
BackColor="White" BorderColor="#DEDFDE" BorderStyle="None" BorderWidth="1px"
CellPadding="4" DataKeyNames="Id" DataSourceID="LinqClientesComplemento"
ForeColor="Black" GridLines="Vertical"
onselectedindexchanged="grdClientes_SelectedIndexChanged"
OnRowDataBound="gvSetor_RowDataBound" OnRowEditing="grdClientes_RowEditing">
<RowStyle BackColor="#F5F2E9" />
<Columns>
<asp:CommandField ShowSelectButton="True" />
<asp:BoundField DataField="DataValidade" HeaderText="DataValidade"
SortExpression="DataValidade" />
<asp:BoundField DataField="VlrHoraAnalista" HeaderText="VlrHoraAnalista"
SortExpression="VlrHoraAnalista" />
<asp:BoundField DataField="VlrHoraCliente" HeaderText="VlrHoraCliente"
SortExpression="VlrHoraCliente" />
<asp:BoundField DataField="Km" HeaderText="Km" SortExpression="Km" />
</Columns>
<FooterStyle BackColor="#CCCC99" />
<PagerStyle BackColor="#F7F7DE" ForeColor="Black" HorizontalAlign="Right" />
<SelectedRowStyle BackColor="#CE5D5A" Font-Bold="True" ForeColor="White" />
<HeaderStyle BackColor="#6B696B" Font-Bold="True" ForeColor="White" />
<AlternatingRowStyle BackColor="White" />
</asp:GridView>
protected void lbxClientes_SelectedIndexChanged(object sender, EventArgs e)
{
pnlClientes.Visible = false;
grdClientes.DataBind();
pnlOpcoes.Visible = false;
pnlNovoProduto.Visible = false;
pnlClientes.Visible = true;
}
protected void btnClientes_Click(object sender, EventArgs e)
{
pnlOpcoes.Visible = false;
pnlClientes.Visible = true;
pnlNovoCliente.Visible = false;
pnlNovoClienteComplemento.Visible = false;
}
protected void btnClienteVoltar_Click(object sender, EventArgs e)
{
pnlOpcoes.Visible = true;
pnlClientes.Visible = false;
}
protected void btnNovoCliente_Click(object sender, EventArgs e)
{
btnSalvaCliente.Text = "Insere";
txtNomeCliente.Text = "";
pnlOpcoes.Visible = false;
pnlNovoCliente.Visible = true;
pnlClientes.Visible = true;
grdClientes.Visible = false;
}
protected void btnCancelaCliente_Click(object sender, EventArgs e)
{
pnlOpcoes.Visible = false;
pnlNovoCliente.Visible = false;
pnlClientes.Visible = true;
grdClientes.Visible = true;
}
protected void grdClientes_SelectedIndexChanged(object sender, EventArgs e)
{
btnSalvaCCliente.Text = "Salva";
DataClassesDataContext dc = new DataClassesDataContext();
var complemento = (from c in dc.ClientesComplementos
where c.Id.Equals(int.Parse(grdClientes.SelectedDataKey.Value.ToString()))
select c).Single();
txtValidadeCliente.Text = complemento.DataValidade.ToString();
txtValorCliCliente.Text = complemento.VlrHoraCliente.ToString();
txtVlrCliAnalista.Text = complemento.VlrHoraAnalista.ToString();
txtCliKm.Text = complemento.Km.ToString();
pnlOpcoes.Visible = false;
pnlClientes.Visible = true;
pnlNovoClienteComplemento.Visible = true;
btnExluiCCliente.Visible = true;
}
protected void btnSalvaCliente_Click(object sender, EventArgs e)
{
DataClassesDataContext dc = new DataClassesDataContext();
int id = 0;
if (id > 0)
{
var cliente = (from c in dc.Clientes
where c.Id.Equals(id)
select c).Single();
cliente.Nome = txtNomeCliente.Text;
dc.SubmitChanges();
}
else
{
Cliente cliente = new Cliente();
cliente.Nome = txtNomeCliente.Text;
cliente.Usuario = Session["__cUserName"].ToString();
dc.Clientes.InsertOnSubmit(cliente);
dc.SubmitChanges();
ClientesComplemento complemento = new ClientesComplemento();
complemento.IdCliente = cliente.Id;
complemento.VlrHoraAnalista = 0;
complemento.VlrHoraCliente = 0;
complemento.Km = 0;
dc.ClientesComplementos.InsertOnSubmit(complemento);
dc.SubmitChanges();
}
pnlClientes.Visible = false;
pnlOpcoes.Visible = true;
grdClientes.DataBind();
grdClientes.Visible = true;
lbxClientes.DataBind();
pnlOpcoes.Visible = false;
pnlNovoCliente.Visible = false;
pnlClientes.Visible = true;
}
protected void btnExluicliente_Click(object sender, EventArgs e)
{
DataClassesDataContext dc = new DataClassesDataContext();
int id = int.Parse(lbxClientes.SelectedValue.ToString());
var complemento = from c in dc.ClientesComplementos
where c.IdCliente.Equals(id)
select c;
dc.ClientesComplementos.DeleteAllOnSubmit(complemento);
var cliente = (from c in dc.Clientes
where c.Id.Equals(id)
select c).Single();
dc.Clientes.DeleteOnSubmit(cliente);
try
{
dc.SubmitChanges();
}
catch
{
dc.Transaction.Rollback();
}
finally
{
lbxClientes.DataBind();
grdClientes.DataBind();
pnlClientes.Visible = true;
}
}
protected void btnNovoCCliente_Click(object sender, EventArgs e)
{
btnSalvaCCliente.Text = "Insere";
txtValidadeCliente.Text = "";
txtValorCliCliente.Text = "";
txtVlrCliAnalista.Text = "";
txtCliKm.Text = "";
pnlOpcoes.Visible = false;
pnlNovoClienteComplemento.Visible = true;
pnlClientes.Visible = true;
grdClientes.Visible = false;
}
protected void btnSalvaCCliente_Click(object sender, EventArgs e)
{
DataClassesDataContext dc = new DataClassesDataContext();
int id = 0;
if (btnSalvaCCliente.Text == "Salva")
id = int.Parse(grdClientes.SelectedDataKey.Value.ToString());
if (id > 0)
{
var complemento = (from c in dc.ClientesComplementos
where c.Id.Equals(id)
select c).Single();
complemento.VlrHoraAnalista = decimal.Parse(txtVlrCliAnalista.Text);
complemento.VlrHoraCliente = decimal.Parse(txtValorCliCliente.Text);
complemento.Km = decimal.Parse(txtCliKm.Text);
if (txtValidadeCliente.Text.Length > 0)
complemento.DataValidade = DateTime.ParseExact(txtValidadeCliente.Text, "dd/MM/yyyy", null);
dc.SubmitChanges();
}
else
{
ClientesComplemento complemento = new ClientesComplemento();
complemento.IdCliente = int.Parse(lbxClientes.SelectedValue.ToString());
complemento.VlrHoraAnalista = decimal.Parse(txtVlrCliAnalista.Text);
complemento.VlrHoraCliente = decimal.Parse(txtValorCliCliente.Text);
complemento.Km = decimal.Parse(txtCliKm.Text);
if (txtValidadeCliente.Text.Length > 0)
complemento.DataValidade = DateTime.ParseExact(txtValidadeCliente.Text, "dd/MM/yyyy", null);
dc.ClientesComplementos.InsertOnSubmit(complemento);
dc.SubmitChanges();
}
pnlNovoClienteComplemento.Visible = false;
grdClientes.DataBind();
grdClientes.Visible = true;
pnlOpcoes.Visible = false;
pnlNovoClienteComplemento.Visible = false;
pnlClientes.Visible = true;
}
protected void btnExluiCCliente_Click(object sender, EventArgs e)
{
DataClassesDataContext dc = new DataClassesDataContext();
int id = int.Parse(grdClientes.SelectedDataKey.Value.ToString());
var complemento = (from c in dc.ClientesComplementos
where c.Id.Equals(id)
select c).Single();
dc.ClientesComplementos.DeleteOnSubmit(complemento);
dc.SubmitChanges();
pnlNovoClienteComplemento.Visible = false;
grdClientes.DataBind();
pnlOpcoes.Visible = false;
pnlNovoClienteComplemento.Visible = false;
pnlClientes.Visible = true;
}
protected void btnCancelaCCliente_Click(object sender, EventArgs e)
{
pnlOpcoes.Visible = false;
pnlNovoClienteComplemento.Visible = false;
pnlClientes.Visible = true;
grdClientes.Visible = true;
}
protected void gvSetor_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.DataItemIndex != -1)
{
e.Row.Attributes.Add("onclick", ClientScript.GetPostBackEventReference(grdClientes, "Edit$" + e.Row.RowIndex));
e.Row.Attributes.Add("onMouseover", "this.style.background='#FCF3C4';this.style.cursor='hand'");
//Verifica se a linha alternada e aplica o estilo
if (e.Row.RowState == DataControlRowState.Alternate)
{
e.Row.Attributes.Add("onMouseout", "this.style.background='#FFFFFF';this.style.cursor='hand'");
}
else
{
e.Row.Attributes.Add("onMouseout", "this.style.background='#F5F2E9';this.style.cursor='hand'");
}
}
}
protected void grdClientes_RowEditing(object sender, GridViewEditEventArgs e)
{
int Codigo = Convert.ToInt32(grdClientes.DataKeys[e.NewEditIndex].Value);
pnlClientes.Visible = false;
grdClientes.DataBind();
pnlOpcoes.Visible = false;
pnlNovoProduto.Visible = false;
pnlClientes.Visible = true;
}
GOSTEI 0
Fabio Mans
23/04/2009
Manda um print da tela, no seu grid não tem Edit, estranho.
GOSTEI 0
Fabricio Santos
23/04/2009
Essa é antes de clicar em nada
essa e quando clico em algum lugar da linha e o que esta errado
essa e o que quero que acnteca quando eu clicar na linha. Hore esta ocorrendo so quando clico em Selecionar.
GOSTEI 0
Fabio Mans
23/04/2009
Não achei o erro, tente refazer com os exemplos que te passei, o conceito você já tem.
GOSTEI 0
Fabricio Santos
23/04/2009
Boa noite Fabio,
consegui resolver deixando o evento RowDatabound da seguinte maneira:
protected void gvSetor_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.DataItemIndex != -1)
{
LinkButton lnk = (LinkButton)e.Row.Cells[0].Controls[0];
e.Row.Attributes.Add("onClick", Page.GetPostBackEventReference(lnk, ""));
e.Row.Attributes.Add("onMouseover", "this.style.background='#FCF3C4';this.style.cursor='hand'");
if (e.Row.RowIndex % 2 == 1)
{
e.Row.Attributes.Add("onMouseout", "this.style.background='#FFFFFF';this.style.cursor='hand'");
}
else
{
e.Row.Attributes.Add("onMouseout", "this.style.background='Silver';this.style.cursor='hand'");
}
}
}
Pode encerrar o chamado.
Grato,
Fabrício
GOSTEI 0