Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Dagmar Cirino

Digitar em Textbox's (10), criar outros 5 textbox's em panel

Recommended Posts

Boa tarde.

Como este é meu primeiro tópico e estou muito "ferrado"/sem tempo neste projeto, li as regras "por cima" e estou precisando da ajuda de vocês.

...

Tenho uma aplicação em C# (ex: montadora), que na tela (ex: telaConcessionaria), tenho 10 textbox de um lado, e um panel mostrando outra tela (ex: telaCarro) do outro.

Preciso que, se digitar em qualquer um dos 10 textbox, o panel seja carregado com outra tela (ex: telaCarroPlacas) e crie 5 textbox's em uma linha.

Mas, se o usuário digitar um valor em outro dos 10 textbox's da tela telaConcessionaria, na telaCarroPlacas seja criado mais 5 textbox's abaixo dos que já estão nela. E se for digitado em 3, 4, 7, N, na telaCarroPlacas seja criado 3, 4, 7, N linhas com 5 textbox's cada.

Se o usuário apagar o valor de qualquer uma das 10 textbox's, uma linha com 5 textbox's também será apagada ("descriada"), se apagar todos os valores em todos os textbox's, a telaCarroPlacas será fechada, voltando a tela padrão/inicial.

 

Bom pessoal, é isso. Não importa a qualtidade de caracteres em cada textbox, e sim, quantos textbox's serão digitados para adicionar a mesma quantidade de linhas com 5 textbox's cada na telaCarroPlacas.

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, vou passar sua duvida para ver se é isso mesmo:

 

Você tem 10 textbox, e precisa que quando o usuário digitar um valor em QUALQUER uma das Txtbox sejam criadas outras 5 abaixo dela ok? Porem se ele digitar, por exemplo, que o numero de carros é 10 então serão criadas 10 textbox, estou correto?

 

Bom, vou te passar o comando para criar controles por programação, esse é o básico, você pode modificá-lo e aplicar em diversas funcionalidades, é o "coringa", se a sua duvida for esta que eu falei daí me avise e eu te passo uma rotina que cria textbox de acordo com o numero e as posiciona no formulário ;)

 

Bom, a rotina para a criação de um elemento é baseada em um for, onde o numero de textbox será inserida na variável de contagem criando um Array de objetos:

 

 

namespace WindowsFormsApplication1
{
   public partial class Form1 : Form
   {

       Static int valor = Integer.parse(Textboxnumero.Text) +1;
       TextBox[] txt = new TextBox[valor]; //Array de objetos
       int X, Y; //Variaveis de posição

       public Form1()
       {
           InitializeComponent();
       }

       private void Form1_Load(object sender, EventArgs e)
       {


           for (int i = 0; i < txt.Length; i++) //For para i sendo menor que o numero de textbox da variavel valor, por isso somamos +1 nela
           {

              txt[i] = new TextBox(); //Nova instancia

               txt[i].Location = new Point(X+<PosiçãoX>,Y+<posiçãoY>); //Adiciona um valor a distancia da textbox anterior para que elas não fiquem na mesma posição

               X = txt[i].Location.X; //Atribui novos valores as variáveis de posição para que a posição mude conforme o objeto

               Y = txt[i].Location.Y;

               this.Controls.Add(txt[i]);

           }
       }
   }
}

 

 

 

No seu caso a posição X seria sempre a mesma, o que mudaria seria o Y, então você pode definir no próprio form um lugar adequado para sua caixa e mudar a posição Y de 30 em 30 visto que esses controles tem 20 de altura.

 

É possivel editar todo e qualquer propriedade da texbox dentro do for, visto que cada textbox leva o nome do contador, por exemplo, neste caso seria Txt1, Txt2 .... TxtN e por isso é necessário o uso do quando estiver referenciando cada um dos controles, visto que a contagem deles, 1, 2, 3, 4, 5 e etc começa de cima para baixo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado pela resposta KhaosDoctor. É basicamente isto.

Tenho 2 panel na tela.

Panel 1 com 10 textbox, uma Panel 2 tenho uma tela de boas vindas (padrão).

se o usuário digitar no textobox1 qualquer coisa, o Panel 2 vai chamar outra tela, e vai mostrar 5 textbox, um do lado do outro.

se o usuário digitar qualquer valor em outro textbox, no panel 2 vai ser criado mais 5 textbox em baixo dos que já foram criados.

se o usuário digitar em quantos textbox quiser, para cada textbox que teve o valor alterado, também será criado a mesma quantidade de linhas no Panel 2, com 5 textbox cada.

(se 1 textbox for diferente de vazio, cria uma linha com 5 textbox no panel 2)

(se 2 textbox for diferente de vazio, cria mais uma linha com 5 textbox no panel 2)

 

e se o usuario apagar um valor de um textbox, consequentemente uma linha com as 5 textbox será apagada ("descriada") do Panel 2.

Se nenhum textbox tiver valor, o Panel 2 volta para a tela de boas vindas (padrão).

 

Obrigado.

Dagmar Cirino

dagmar.mv@gmail.com

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você precisará de um timer ou então no evento TextChanged você vai precisar colocar essa verificação, mas o código base é esse.

 

Obrigado pela ajuda, mas está dificil aqui. Não estou conseguindo fazer os textbox aparecerem no panel 2 =(

 

Estou tentando fazer de outra forma agora. Criei todos os textbox no panel 2, e deixei como invisivel. Quanto um textbox do panel 1 tiver texto, os 5 textbox de uma linha são visiveis. Mas agora parei nisso, não consigo acessar os textbox do panel 2 pelo panel 1, e o panel 2 é outro form chamado.

 

Pode me ajudar com este código ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Resolvido.

 

Consegui depois de tanto quebrar a cabeça.

 

Fiz da seguinte maneira...

No form com os textbox para digitar.

 

public void MostraCamposFormulario(Control.ControlCollection controles)
       {
           int qtd = 0;

           foreach (Control ctlc in PanelZeramento.Controls)
           {
               if ((ctlc is TextBox) && ((TextBox)ctlc).Text.Length > 0)
               {
                   qtd++;
               }
           }
           //MessageBox.Show("total" + qtd);
           telas.sobreBoleto sobreBoleto = new telas.sobreBoleto();
           sobreBoleto.Owner = (Form)this; 
           sobreBoleto.TopLevel = false;
           Panel4.Controls.Add(sobreBoleto);
           sobreBoleto.BringToFront();

           if (qtd > 1)
           {
               sobreBoleto.Show();
               //vis   = visualizar
               //novis = no-visualizar
               bool vis = true;
               bool novis = false;
               if (qtd == 2)
               {
                   sobreBoleto.visibilidade(vis, vis, novis, novis, novis, novis, novis, novis, novis, novis);
               }
               else if (qtd == 3)
               {
                   sobreBoleto.visibilidade(vis, vis, vis, novis, novis, novis, novis, novis, novis, novis);
               }
               else if (qtd == 4)
               {
                   sobreBoleto.visibilidade(vis, vis, vis, vis, novis, novis, novis, novis, novis, novis);
               }
               else if (qtd == 5)
               {
                   sobreBoleto.visibilidade(vis, vis, vis, vis, vis, novis, novis, novis, novis, novis);
               }
               else if (qtd == 6)
               {
                   sobreBoleto.visibilidade(vis, vis, vis, vis, vis, vis, novis, novis, novis, novis);
               }
               else if (qtd == 7)
               {
                   sobreBoleto.visibilidade(vis, vis, vis, vis, vis, vis, vis, novis, novis, novis);
               }
               else if (qtd == 8)
               {
                   sobreBoleto.visibilidade(vis, vis, vis, vis, vis, vis, vis, vis, novis, novis);
               }
               else if (qtd == 9)
               {
                   sobreBoleto.visibilidade(vis, vis, vis, vis, vis, vis, vis, vis, vis, novis);
               }
               else if (qtd == 10)
               {
                   sobreBoleto.visibilidade(vis, vis, vis, vis, vis, vis, vis, vis, vis, vis);
               }
               else if(qtd < 2)
               {                    
                   sobreBoleto.Hide();
               }
           }                

       }

       // chamando a verificação
       private void tbxUSDEntrada_TextChanged(object sender, EventArgs e)
       {/* ------------------------------------------------------------- */
           // Fazendo de tudo para adicionar 5 textbox no panel4, para cada textbox do panel3 digitado.
           // Ta treta mano =[
           /* ------------------------------------------------------------- */            
           MostraCamposFormulario(PanelZeramento.Controls);
           tbxUSDSaida.Enabled = false;
       }    

 

 

 

E no outro form, ...

       //recebendo as referencias para ficar visivel
       public void visibilidade(bool p1, bool p2, bool p3, bool p4, bool p5, bool p6, bool p7, bool p8, bool p9, bool p10)
       {
           Boleto aaa = new Boleto();

           panelLinha1.Visible = p1;
           panelLinha2.Visible = p2;
           panelLinha3.Visible = p3;
           panelLinha4.Visible = p4;
           panelLinha5.Visible = p5;
           panelLinha6.Visible = p6;
           panelLinha7.Visible = p7;
           panelLinha8.Visible = p8;
           panelLinha9.Visible = p9;
           panelLinha10.Visible = p10;
       }

 

e no designer, eu criei 10 panels, com 5 textbox cada, e deixei o panel invisivel. Só é vivivel se receber as referencias.

 

Me matutei, mas consegui :)

 

Ps. como é só um protótipo, não necessito ainda de um código bonito e sem gambis.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, vou passar sua duvida para ver se é isso mesmo:

 

Você tem 10 textbox, e precisa que quando o usuário digitar um valor em QUALQUER uma das Txtbox sejam criadas outras 5 abaixo dela ok? Porem se ele digitar, por exemplo, que o numero de carros é 10 então serão criadas 10 textbox, estou correto?

 

Bom, vou te passar o comando para criar controles por programação, esse é o básico, você pode modificá-lo e aplicar em diversas funcionalidades, é o "coringa", se a sua duvida for esta que eu falei daí me avise e eu te passo uma rotina que cria textbox de acordo com o numero e as posiciona no formulário ;)

 

Bom, a rotina para a criação de um elemento é baseada em um for, onde o numero de textbox será inserida na variável de contagem criando um Array de objetos:

 

 

namespace WindowsFormsApplication1
{
   public partial class Form1 : Form
   {

       Static int valor = Integer.parse(Textboxnumero.Text) +1;
       TextBox[] txt = new TextBox[valor]; //Array de objetos
       int X, Y; //Variaveis de posição

       public Form1()
       {
           InitializeComponent();
       }

       private void Form1_Load(object sender, EventArgs e)
       {


           for (int i = 0; i < txt.Length; i++) //For para i sendo menor que o numero de textbox da variavel valor, por isso somamos +1 nela
           {

              txt[i] = new TextBox(); //Nova instancia

               txt[i].Location = new Point(X+<PosiçãoX>,Y+<posiçãoY>); //Adiciona um valor a distancia da textbox anterior para que elas não fiquem na mesma posição

               X = txt[i].Location.X; //Atribui novos valores as variáveis de posição para que a posição mude conforme o objeto

               Y = txt[i].Location.Y;

               this.Controls.Add(txt[i]);

           }
       }
   }
}

 

 

 

No seu caso a posição X seria sempre a mesma, o que mudaria seria o Y, então você pode definir no próprio form um lugar adequado para sua caixa e mudar a posição Y de 30 em 30 visto que esses controles tem 20 de altura.

 

É possivel editar todo e qualquer propriedade da texbox dentro do for, visto que cada textbox leva o nome do contador, por exemplo, neste caso seria Txt1, Txt2 .... TxtN e por isso é necessário o uso do quando estiver referenciando cada um dos controles, visto que a contagem deles, 1, 2, 3, 4, 5 e etc começa de cima para baixo.

 

Você pode me passar a rotina que cria textbox de acordo com o numero e as posiciona no formulário ?

Não foi validado da forma que eu fiz. Porque agora, os textbox serão numéricos, e o valor digitado, tem que aparecer em um textbox que for criado no panel 2. E vou ter que "amarrar" cada um, pois se o usuário digitar, ex: valores em 4 textbox do panel 1, eles vão aparecer dentro do primeiro textbox de cada linha criada no panel 2. E se o usuário apagar qualquer textbox do panel1, a linha que foi criada através dele tem que ser apagada, e se for a terceira linha, vai ficar um buraco na tela. Tenho que arrumar um jeito, de, se for a terceira linha a ser apagada, todas as demais serão encaixadas para cima, de forma a ficar uma linha em baixo da outra, com todos os textbox alinhados, 5 em cada linha.

 

Complicado, não?

E isso, porque é um protótipo, hehehe. E não sou o cara de dev, sou de front.

 

Se poder ajudar :)

 

Obrigado.

Dagmar Cirino

dagmar.mv@gmail.com

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, para realinhar é um pouco mais trabalhoso, beeeem mais trabalhoso, mas para criar as textbox você usa o código base que eu passei lá encima:

 

 

namespace WindowsFormsApplication1
{
   public partial class Form1 : Form
   {

       Static int valor = Integer.parse(Textboxnumero.Text) +1;
       TextBox[] txt = new TextBox[valor]; //Array de objetos
       int X, Y; //Variaveis de posição

       public Form1()
       {
           InitializeComponent();
       }

       private void Form1_Load(object sender, EventArgs e)
       {


           for (int i = 0; i < txt.Length; i++) //For para i sendo menor que o numero de textbox da variavel valor, por isso somamos +1 nela
           {

      		txt[i] = new TextBox(); //Nova instancia

               txt[i].Location = new Point(X+<PosiçãoX>,Y+<posiçãoY>); //Adiciona um valor a distancia da textbox anterior para que elas não fiquem na mesma posição

               X = txt[i].Location.X; //Atribui novos valores as variáveis de posição para que a posição mude conforme o objeto

               Y = txt[i].Location.Y;

               this.Controls.Add(txt[i]);

           }
       }
   }
}

 

 

E ai você vai precisar fazer umas contas pra posicionamento, vou da um exemplo ai você pode aplicar:

 

Imagine que temos duas textbox colocadas respectivamente no 10 e 40 do eixo X, no eixo Y ambas estão no 50, logo elas estão lado a lado.

 

Para você poder adicionar diversas outras textboxes lado a lado alinhadas com esta, o código deverá sofre algumas alterações, primeiro:

 

O int Y não será mais necessário já que o Y é sempre o mesmo, o int X então deve receber o valor inicial de -20 porque teremos de somar 30 nele (já que a primeira está no 10 e a segunda no 40, 40-10 = 30) ficando assim:

 

 

namespace WindowsFormsApplication1
{
   public partial class Form1 : Form
   {

       Static int valor = Integer.parse(Textboxnumero.Text);
       TextBox[] txt = new TextBox[valor]; //Array de objetos
       [b]int X=-20[/b]; //Variaveis de posição

       public Form1()
       {
           InitializeComponent();
       }

       private void Form1_Load(object sender, EventArgs e)
       {


           for (int i = 0; i < txt.Length; i++) //For para i sendo menor que o numero de textbox da variavel valor, por isso somamos +1 nela
           {

      		txt[i] = new TextBox(); //Nova instancia

               txt[i].Location = new Point(X+30,50); //Adiciona um valor a distancia da textbox anterior para que elas não fiquem na mesma posição

               X = txt[i].Location.X; //Atribui novos valores as variáveis de posição para que a posição mude conforme o objeto



               this.Controls.Add(txt[i]);

           }
       }
   }
}

 

 

Nesta parte:

 

txt[i].Location = new Point(X+30,50);

 

Estamos definindo o X como -20, somamos 30, adicionamos o lugar da primeira TXT (Supondo que não há nenhuma no form), após isso estaremos atualizando este valor, dizendo:

 

X = Txt[i].Location.X;

 

 

Então o X passa a valer 10, somando 30 temos 40, que é a segunda TXT e assim por diante

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.