PREENCHER TEXTBOX NA SELE?AO DA LINHA DO DATAGRID
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?
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?
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.
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.
Resolvido!!!
Fiz da seguinte forma...
1 - Adicionei a coluna no select do Datagrid;
2 - Ocultei essa Coluna;
3 - Peguei o evento da seleção da linha e especifiquei a coluna desejada.
Ficou show de bola!
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!
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.
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.
Bom dia.
Consegui resolver da seguinte forma...
Estaria correto desta forma?
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?
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.
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.
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();
}
}
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();
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();
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