PREENCHER TEXTBOX NA SELE?AO DA LINHA DO DATAGRID

ROGERIOAZEVEDO 15/07/2014 09:48:23
#439543
Bom dia.

Galera, tenho uma Datagrid que traz uma relação de ordens de serviço. Nessa tabela de ordens de serviço há uma coluna que é descrito o defeito da ordem de serviço, no entanto por ser um texto extenso eu removi do select essa coluna, e tenho o objetivo de colocá-la em uma textbox logo abaixo do Grid, como pode ser visto nessa imagem: http://prntscr.com/42vwdr .

Inicialmente pensei em usar o select da linha para pegar uma coluna especifica e criar um parametro para um novo select, mas pensando melhor pode ser mais fácil e simples, colocar novamente a coluna que eu removi do select, mas ocultar a mesma no datagrid, e preencher o textbox com o nome da coluna baseado na seleção da linha, isso é possível, alguem já fez algo parecido?
NILSONTRES 15/07/2014 10:52:29
#439544
Sim é possivel. Mas !
Como sempre digo, quando vc faz um sistema, tem sempre de pensar ele como um sistema multi Usuários.
Nos meus primeiros sistemas ainda em vb6(2002), eu tive sérios problemas com grades.
Não devo utilizar grades ? Claro que deve, esse é o controle mais utilizado em meus sistemas.
Independente de já carregar no select ou não, olha o que pode acontecer:
O usuário 1 carrega esses registros, ou demora para selecionar a linha, ou demora para editar o texto carregado.
O usuário 2 nesse intervalo, já selecionou e editou, então o que o usuário 1 vê, é algo já desatualizado.
Isso é só um exemplo, coisas graves podem acontecer, como no meu caso, onde uma ordem de serviço foi cobrada, mas estava
carregada em uma grade em outra maquina, o usuário da outra maquina editou essa OS, e ela voltou como ainda não cobrada.
Como resolver esse problema ?, vejo muitos com soluções de criar um campo na tabela para marcar se o registro esta sendo editado ou não, mas
isso não é seguro, pois o pc pode desligar nesse intervalo.
Só resolvi comparando o campo timestamp, no meu caso com o (Mysql).
Assim, gravo a hora que o registro foi carregado, e antes de editá-lo, verifico se o timestamp é mais novo que essa data, se for , é porque alguem já editou
nesse meio tempo.

ROGERIOAZEVEDO 15/07/2014 10:54:11
#439545
Resolvido!!!

Fiz da seguinte forma...

1 - Adicionei a coluna no select do Datagrid;

2 - Ocultei essa Coluna;
dgvOrdem.Columns[[Ô]Texto[Ô]].Visible = false;


3 - Peguei o evento da seleção da linha e especifiquei a coluna desejada.

private void dgvOrdem_SelectionChanged(object sender, EventArgs e)
{
txbTexto.Text = dgvOrdem.CurrentRow.Cells[[Ô]Texto[Ô]].Value.ToString();
}


Ficou show de bola!
ROGERIOAZEVEDO 15/07/2014 11:00:20
#439546
Oi Nilson,

Não terei esse tipo de problema pois esse formulário em questão é de apenas consulta, não há que ser editado. Estava tentando e me deparei com o seguinte erro ao reordenar uma coluna, alguem sabe o que ocasionou esse erro?

http://prntscr.com/42wk0z

Obrigado.

ROGERIOAZEVEDO 15/07/2014 11:18:02
#439547
Bom dia.

Consegui resolver da seguinte forma...

private void dgvOrdem_SelectionChanged(object sender, EventArgs e)
{
foreach (DataGridViewRow row in dgvOrdem.SelectedRows)
{
string value1 = row.Cells[[Ô]Texto[Ô]].Value.ToString();
txbTexto.Text = value1.ToString();
}
}


Estaria correto desta forma?
JABA 15/07/2014 14:01:09
#439556
Resposta escolhida
Citação:

private void dgvOrdem_SelectionChanged(object sender, EventArgs e)
{
txbTexto.Text = dgvOrdem.CurrentRow.Cells[[Ô]Texto[Ô]].Value.ToString();
}



Testei aqui dessa forma e não tive problemas com a ordenação, veja:

private void dgvOrdem_SelectionChanged(object sender, EventArgs e)
{
txbTexto.Text = sender.CurrentRow.Cells[4].Value.ToString(); // usei o [Ô]sender[Ô] em vez de usar diretamente o grid e também trabalhei com o indice da coluna.
}

Testa ai dessa forma e nos dê um retorno.
ROGERIOAZEVEDO 15/07/2014 18:09:10
#439566
Boa tarde.

Jaba,

Não sei porque deu erro quando coloquei essa linha conforme você passou. Erro: http://prntscr.com/43171b

Olhe como eu fiz... estaria correto assim? Não deu erro nenhum até agora.

private void dgvOrdem_SelectionChanged(object sender, EventArgs e)
{
foreach (DataGridViewRow row in dgvOrdem.SelectedRows)
{
string value1 = row.Cells[[Ô]Texto[Ô]].Value.ToString();
txbTexto.Text = value1.ToString();
}
}
JABA 15/07/2014 19:52:22
#439571
Deu erro porque está faltando um Cast para converter o [Ô]sender[Ô] para um [Ô]Datagridview[Ô].
A solução que você chegou não está incorreta, mas ta parecendo uma gambiarra para resolver um problema simples. Acho que o único problema que você pode ter com esse código é se houver mais de um registro selecionado, daí sempre irá mostrar no TextBox a ultima seleção de registro feita do grid.

Outra coisa: Por que você não atribui o valor diretamente para o TextBox ao invés de criar uma variável para isso?

Por exemplo:

txbTexto.Text = row.Cells[[Ô]Texto[Ô]].Value.ToString();
ROGERIOAZEVEDO 18/07/2014 13:22:40
#439647
Citação:

:
Outra coisa: Por que você não atribui o valor diretamente para o TextBox ao invés de criar uma variável para isso?

Por exemplo:

txbTexto.Text = row.Cells[[Ô]Texto[Ô]].Value.ToString();



Eu fiz assim:
txbTexto.Text = dgvOrdem.CurrentRow.Cells[[Ô]Texto[Ô]].Value.ToString();

da primeira vez, mas quando eu reordenava qualquer das colunas dava erro. Testei do jeito que você sugeriu e deu certo.

txbTexto.Text = row.Cells[[Ô]Texto[Ô]].Value.ToString();
Tópico encerrado , respostas não são mais permitidas