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

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

[code]<asp:GridView ID=“GridView1” runat=“server” AutoGenerateColumns=“False” DataKeyNames="c1tbl392"
DataSourceID=“SqlDataSource1” EnableModelValidation=“True” OnRowCommand=“GridView1_RowCommand” >

<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>[/code]

CodeBehind - Start equipamento - Pegando parâmetro do último registro

[code]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);
        }[/code]

Se alguem conseguir me dar um help agradeço.

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

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.

[code]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;  [/code]

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.

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: [code]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…
[/code] O que acha?

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!

Ótimo!