[RESOLVIDO] Passar o valor de uma coluna de um GridView pelo seu índice C#

5 respostas
cle.darsie

Olá pessoal,

Tenho um GridView com 2 colunas, uma delas é preenchida com nome de equipamentos que utilizo diretamente pelo banco de dados, a outra coluna, eu tenho botões que acionam esses equipamentos.
Quando eu clico no botão, ele passa como parâmetro para o equipamento o nome do equipamento que consta na coluna 1 do GridView.

O problema que estou tendo é que preciso alterar a cor dos botões quando é clicado, portanto eu envio para o RowCommand o índice da linha que eu clico para o botão alterar a cor.

Segue abaixo o código comentado referente ao projeto para análise: GridView
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="c1tbl392" 
            DataSourceID="SqlDataSource1" EnableModelValidation="True" OnRowCommand="GridView1_RowCommand" >
            <Columns>
                <asp:BoundField DataField="c1tbl392" HeaderText="Equipamento" ReadOnly="True" SortExpression="c1tbl392" />

                <asp:TemplateField HeaderText="Start / Stop">
                    <ItemTemplate>
                        <asp:Button ID="BtnStartStop" runat="server" CommandName="StartStop" Text="Start" Width="120px" 
                            CommandArgument="<%# ((GridViewRow) Container).RowIndex %>" BackColor="Green" />
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>
CodeBehind - Start equipamento - Pegando parâmetro do último registro
int index = int.Parse((string)e.CommandArgument);
            Button btnGeral = (Button)GridView1.Rows[index].FindControl("BtnStartStop");
            string equip = "";
            
            if (btnGeral.Text == "Start")
            {
                //equip = e.CommandArgument.ToString();
                //int ind = int.Parse((string)e.CommandArgument);//e.CommandArgument.ToString();
                //equip = GridView1.Rows[ind].Cells["c1tbl392"].Text;

                for (int i = 0; i < GridView1.Rows.Count; i++)
                {
                    GridViewRow row = GridView1.Rows[i];
                    equip = (String)GridView1.DataKeys[row.RowIndex].Value; //Aqui está passando somente o valor do último indice, e não da linha do botão clicado
                }
                             
                System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
                startInfo.CreateNoWindow = false;
                startInfo.UseShellExecute = false;
                startInfo.FileName = @"c:\apl\LisConnect.exe";
                startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Maximized;
                startInfo.Arguments = "-p -" + equip;

                Process exeProcess = Process.Start(startInfo);
            }

Se alguem conseguir me dar um help agradeço.

5 Respostas

Nicolas_Fernandes

O problema, no caso, seria que não está alterando a cor?

cle.darsie

Olá Nicolas,
Não, eu já consigo alterar a cor, eu não estou conseguindo pegar o nome do equipamento para passar por parâmetro.
Sem o nome, o equipamento não aciona.

Nessa parte do código que eu aciono, mas tenho que pegar o nome do equipamento pelo indice da sua coluna.
for (int i = 0; i < GridView1.Rows.Count; i++)  
                {  
                    GridViewRow row = GridView1.Rows[i];  
                    equip = (String)GridView1.DataKeys[row.RowIndex].Value; //Aqui está passando somente o valor do último indice, e não da linha do botão clicado  
                }  
                               
                System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();  
                startInfo.CreateNoWindow = false;  
                startInfo.UseShellExecute = false;  
                startInfo.FileName = @"c:\apl\LisConnect.exe";  
                startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Maximized;  
                startInfo.Arguments = "-p -" + equip;
O que está acontecendo é que ele está fazendo o loop direto até cair no ultimo equipamento, invés de acionar direto o equipamento que te o botão clicado.
Nicolas_Fernandes
Só por curiosidade: eu vejo que você busca os valores de uma tabela de equipamentos e preenche sua GridView com eles. É isso mesmo? Se sim, porque, ao invés de enviar pelo CommandArgument a linha selecionada, você não envia o ID do equipamento em questão? Sendo assim, você busca o registro daquele objeto em questão e faz as operações necessárias. Isso solucionaria sua questão? Algo como:
long objetoID = Convert.ToInt64(e.CommandArgument);

var equipamentoRepository = new EquipamentoRepository();
var equipamento = equipamentoRepository.GetEquipamentoPeloID(objetoID);
//Realiza as operações que você quer com o determinado equipamento...
O que acha?
cle.darsie

Nicolas,
Eu preciso do indice da linha para alterar a cor do botão.

Eu consegui resolver.

Na parte que eu pego o indice da linha e passo para string do nome do equipamento, eu fiz o seguinte:

Isso me dá o nome do item que está na coluna 0 do indice selecionado.

Agora está funcionando como eu gostaria.

Obrigado de qualquer maneira!

Nicolas_Fernandes

Ótimo!

Criado 20 de fevereiro de 2013
Ultima resposta 21 de fev. de 2013
Respostas 5
Participantes 2