Fórum Executar uma query ao clicar no select de um gridview #6293

01/06/2009

0

(uso Vs2008/C#/Linq/Fw 3.5 SP1)

Ola
Sou programador iniciante, e estou com uma duvida,

Tenho 03 tabelas, que controlam a ação de um envolvido,
cada individuo pode ter muitas ações, o problema é que tem uma
tabela de relacionamento que liga o Envolvido com suas ações (tabela Responsavel_acao) ,

Exemplo:

Envolvido
Cod_envolvido - int(auto incremento)
Nome_envolvido - varchar(50)

Acao
Cod_acao - int(auto incremento)
Nome_acao - varchar(50)

Responsavel_acao
Cod_responsavelAcao - int(auto incremento)
Cod_envolvido - int (ligado com a tabela envolvido)
Cod_acao - int (ligado com a tabela acao)

Preciso do seguinte

criei um dridview, coloquei uma coluna
command field, com o botão select  veja:

        <asp:GridView ID="GridView1" runat="server" AllowSorting="True"
            AutoGenerateColumns="False" CellPadding="4" DataKeyNames="cod_envolvido"
            DataSourceID="LinqDataSource1" ForeColor="#333333" GridLines="None"
            onselectedindexchanged="GridView1_SelectedIndexChanged">
            <RowStyle BackColor="#F7F6F3" ForeColor="#333333" />
            <Columns>
                <asp:CommandField ShowDeleteButton="True" ShowEditButton="True"
                    ShowSelectButton="True" />
                <asp:BoundField DataField="cod_envolvido" HeaderText="cod_envolvido"
                    InsertVisible="False" ReadOnly="True" SortExpression="cod_envolvido" />
                <asp:BoundField DataField="Nome" HeaderText="Nome" SortExpression="Nome" />
                <asp:BoundField DataField="matricula" HeaderText="matricula"
                    SortExpression="matricula" />
                <asp:CommandField ButtonType="Button" SelectText="Selecionar"
                    ShowSelectButton="True" />
            </Columns>
            <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
            <PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" />
            <SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" />
            <HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
            <EditRowStyle BackColor="#999999" />
            <AlternatingRowStyle BackColor="White" ForeColor="#284775" />
        </asp:GridView>
        <asp:LinqDataSource ID="LinqDataSource1" runat="server"
            ContextTypeName="SabespDataContext" EnableDelete="True" EnableInsert="True"
            EnableUpdate="True" OrderBy="cod_envolvido" TableName="Envolvidos">
        </asp:LinqDataSource>

Então tenho basicamente a minha tabela mostrada em um gridview
com o botão Selecionar no final, eu gostaria de ao clicar neste botão
selecionar, a seguinte query em linq fosse executada
(eu consigo executar através de um botão)

var dados = from c in db.Envolvidos
                    join p in db.responsavel_acaos on c.cod_envolvido equals p.cod_envolvido
                    join ac in db.acoes on p.cod_acao equals ac.cod_acao
                    where c.cod_envolvido == 1  // Aqui tem que selecionar a linha do grid ....
                    select new
                    {
                        ac.cod_acao,
                        ac.Desc_acao
                    };
    gridAcoesEnvolvidos.DataSource = dados;
   gridAcoesEnvolvidos.DataBind();

   
 Porem na linha where c.cod_envolvido == 1, seria trocado o código com
 o código do envolvido que eu tivesse clicado no grid.
 Pelo pouco que sei tenho que criar um where com session no LinqDataSource
 mas eu não consegui fazer isso..
 Aguardo informações. Obrigado

 
Mateus Lopes

Mateus Lopes

Responder

Posts

02/06/2009

Fabio Mans

Basta você codificar o evento RowCommand


RowCommand     Ocorre sempre quando algum controle do tipo Button for clicado.

Tente algo



protected void gridAcoesEnvolvidos_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        int id = Convert.ToInt32(GvSetor.DataKeys[Convert.ToInt32(e.CommandArgument)][0]);

       var dados = from c in db.Envolvidos
                    join p in db.responsavel_acaos on c.cod_envolvido equals p.cod_envolvido
                    join ac in db.acoes on p.cod_acao equals ac.cod_acao
                    where c.cod_envolvido == id
                    select new
                    {
                        ac.cod_acao,
                        ac.Desc_acao
                    };

//Pode colocar outro Grid por exemplo, no mesmo não vai dar.

    Grid.DataSource = dados;
     Grid1.DataBind();


    }






Responder

Gostei + 0

02/06/2009

Mateus Lopes

Ola, eu tentei, mas ele deu um erro

Error    7    The name 'GvSetor' does not exist in the current context  


vc poderia me explicar o que faz essa linha ?

int id = Convert.ToInt32(GvSetor.DataKeys[Convert.ToInt32(e.CommandArgument)][0]);

eu entendi que o e.CommandArgument é o indice da linha, só não entendi o tal do GvSetor.Datakeys..
(imagino que esse GvSetor seja uma variavel)?

Enfim, não sei..
 

Responder

Gostei + 0

02/06/2009

Fabio Mans

Você tem que trocar para o nome do seu Grid gridAcoesEnvolvidos
GVSetor é o meu grid, que utilizei no meu projeto e colei para você como exemplo.

Fabio
Responder

Gostei + 0

04/06/2009

Fabio Mans

Conseguiu fazer?
Responder

Gostei + 0

08/06/2009

Mateus Lopes

Ola, desculpe pela demora, só no fim de semana consegui
testar seu exemplo, bem tudo funcionou, mas eu preciso
de 3 coisas:

1) Quando mostro os dados no cabeçalho aparece

Cod_acao Desc_acao

Que são as os nomes dos campos que usei no select:

select new
                    {
                        ac.Cod_acao,
                        ac.Desc_acao
                    };

tem como formatar, para Código e Descrição ?


2) Ao clicar em selecionar uma tabela, eu preciso pegar o numero
do código, eu consegui isso com o evento SelectedIndexChanged
peguei um exemplo assim :

        GridViewRow row = GridView1.SelectedRow;
        Label1.Text = "You selected " + row.Cells[1].Text + ".";

Ok, ele mostra em um label, mas eu não queria mostrar no label
eu queria que ele virasse um inteiro (int) pra eu poder jogar em uma
outra rotina, enfim como posso fazer ?

3) Gostaria que ao iniciar o Gridview o primeiro
item já ficasse selecionado é possivel ?

Responder

Gostei + 0

08/06/2009

Fabio Mans



 1) Quando mostro os dados no cabeçalho aparece Cod_acao Desc_acao Que são as os nomes dos campos que usei no select: select new { ac.Cod_acao, ac.Desc_acao }; tem como formatar, para Código e Descrição ?


Você tem que trocar o HeaderText

 <asp:BoundField DataField="Cod_acao" HeaderText="Código" />
 <asp:BoundField DataField="Desc_acao" HeaderText="Descrição" />

=========================================================
2) Ao clicar em selecionar uma tabela, eu preciso pegar o numero do código, eu consegui isso com o evento
SelectedIndexChanged peguei um exemplo assim :

GridViewRow row = GridView1.SelectedRow; Label1.Text = "You selected " + row.Cells[1].Text + ".";

Ok, ele mostra em um label, mas eu não queria mostrar no label eu queria que ele virasse um inteiro (int) pra eu poder jogar em uma outra rotina, enfim como posso fazer ?


Nas propriedades do Grid existe uma que se chamada DataKeyField, coloque o campo código nesta propriedade, em seguida para recuperar este código utilize o exemplo abaixo.

DataKeyField="COD_PRODUTO"

protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
    {
        int seuCodigo = int.Parse(GridView1.SelectedDataKey[0].ToString()); }






=========================================================


3) Gostaria que ao iniciar o Gridview o primeiro item já ficasse selecionado é possivel ?


No evento RowDataBound informe que o SelectedIndex = 0

 protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {

 GvwCargos.SelectedIndex = 0;

    }


Espero ter ajudado.

Fabio
Responder

Gostei + 0

10/06/2009

Devmedia

Mateus,
a resposta do consultor foi suficiente? Podemos encerrar o chamado?
Responder

Gostei + 0

17/06/2009

Devmedia

Mateus,
por falta de retorno estamos mudando o status do seu chamado para concluído. Caso tenha mais duvidas sobre o assunto aqui tratato, por favor, post aqi mesmo q o consultor voltará a lhe atender.
Responder

Gostei + 0

23/06/2009

Mateus Lopes

Ola deu tudo certo, desculpe a demora em responder.
Obrigado a todos
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar