• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Weasel

[VB.NET 2005] For To Next e Textboxes

35 mensagens neste tópico

Pessoal é o seguinte, provavélmente isto é facilimo, mas.... :wallbash:

O problema é o seguinte: Tenho várias textboxes, e queria com um For To preenchelas todas, não existe maneira de fazer isso ?

Dim i As Integer
Dim count As Integer = 1

For i = 1 To 10
TextBox1.Text = abcdxpto[count]
count = count +1
Next 

Como posso fazer isto ? para correr as Textboxes todas ? TextBox1 TextBox2 (...)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A forma mais fácil será criares um controlo array para as textbox's. Estas a utilizar .NET? Em VB6 basta criar uma textbox e em seguida copia-la e cola-la e fica criado. Depois as váreas textbox's ficam com o mesmo nome e apenas são distinguidas pelo indice (index). tipo --> text1(0), text1(1), etc, etc

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Peço desculpa esquecime de por no titulo, é VB.NET, e ao copiar colar, fica TextBox1 TextBox2 (...)

Alguém sabe como o fazer ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Outra solução seria criares uma função do tipo

private sub Ftextboxs(index as integer)

Case 1

      text1

Case 2

      text2

Case 3

      text3

....

end sub

E depois dentro do ciclo farias

for i = 0 to x

      Ftextboxs(i)

next i

Não sei se me fiz entender. Mas isto é menos prático do que criar um control array, mas em VB.NET não sei como se faz :S

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas assim acabo por ter que as escrever todas no codigo na mesma...não vái dar ao mesmo ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

pois, por isso eu disse que não é mt prático. O ideal seria mesmo criar um control array.

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

tenta algo assim:

For Each ctrl As Control In Me.Controls
        If TypeOf ctrl Is TextBox Then
            CType(sender,TextBox).Text = "texto que queres"
        End If
    Next

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Olha tenta esta invenção que acabei de criar;

Dim a,b,i As Integer

Dim count As Integer = 1

a=a

For i = 1 To 10

b="TextBox" & a

b.Text = abcdxpto[count]

count = count +1

a=a+1

Next

Depois diz se funcionou

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

@Tiago Salgado

O teu código diz que: name sender is not declared

Alguma ideia ?

@vbtipo dá erro:

Error 1 'Text' is not a member of 'String'.

;) era fixe se desse assim.

Obrigado :thumbsup: fico á espera das respostas :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu utilizo isto:

Dim ctrl As Control
        For Each ctrl In Me.groupbox1.Controls  ' aqui ten de mudar o nome groupbox para o nome q tens no teu groupbox ou outra coisa qq
            If (ctrl.GetType Is GetType(TextBox)) And (ctrl.Text = "") Then
                MessageBox.Show("  Verifique os dados!  ", "", MessageBoxButtons.OK)
                ctrl.Focus()
        Next

:smoke:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

frodo, não sei porque, este IF não estava a dar If (ctrl.GetType Is GetType(TextBox))

Mas coloquei as textboxes num panel só para elas e resolvi esse problema, mas agora surgiu outro...

É o seguinte, por exemplo tenho 10 textboxes nesse panel, o código que me deste corre-as todas, mas corre aleatoriamente, tipo 1º a TextBox9 depois a 5 depois a 3 depois a 10 depois a 2 etc...

Ficando os valores nas textboxes erradas, pois deveria ser preenchido sucessivamente do 1 ao 10.

Já estive a ver a TAB order (não faço ideia de isso influencia) mas já ordenei tudo certinho e continua a preencher aleatoriamente, não há maneira de contornar isto ?

Obrigado!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

For Each ctrl In Me.groupbox1.Controls 

Não sei se estavas com duvidas neste código mas esta linha o q que faz é percorrer os textbox apenas dentro deste grupo (groupbox1)

Se tiveres um panel tens de ter:

For Each ctrl In Me.panel1.Controls 

Realmente não sei a ordem que percorre mas experimenta apagar as textbox e torna a colocar uma a uma .... (mas é só 1 palpite) ;)

1) textbox1

2) textbox2

...

n)textboxn

:smoke:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Nesse código não havia dúvias, era apenas o IF que não estava a funcionar não sei porque, mas coloquei as textboxes que queria num panel só para elas e resolvi a questão, o problema era a tal aleatoriedade, mas vou experimentar apagar as textboxes e colocar denovo uma a uma, é que quando as criei criei 5 uma a uma e depois foi ctrl+c ctrl+v pode ter sido disso, vou tentar e dou já feedback

;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

:wallbash:

Já não percebo nada, apaguei as textboxes todas (são 25 neste momento), criei tudo denovo uma a uma, testei uma vez, deu bem  ;) e descobri que esse codigo ia da Textbox mais recente para a 1ª criada, não havia problema invertia a ordem das textboxes e dava na boa, foi o que fiz passei a TextBox1 para o fundo da form, e assim sucessivamente até inverter a ordem delas...vou a testar, já preenche denovo aleatoriamente, já não percebo nada...

é que cada textbox deve ter o seu valor e mais nenhum, por isso preencher de forma aleatória está fora de questão.

Como posso dar a volta a isto ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Fiquei curioso e fui investigar mas nao posso fazer mais ;)    (emprego n deixa :) )

Encontrei esta explicação e nao vou traduzir para n se perder nada pelo caminho:

In other words: The Controls collection implements IEnumerable, which

means we can For Each over it in VB. Implementing IEnumerable means

returning an IEnunmerator when asked. All an IEnumerator is *required*

to do is present each element of the collection once and once only, in

response to repeeated calls to MoveNext. So long as it does that, it

has fulfilled its interface contract - we are not entitled to ask for

any more than that.

> and/or how can I get my For Each to go in the sequence I need? Ideas?

The ControlCollection returned by Controls implements IList as well,

which is the interface that has the semantics of an _indexed_ list.

It's obviously an ICollection as well, which means it has a Count. So

to iterate through it in order of the items' indexes, you can use a

normal For Next loop:

Dim ctrl As Control

Dim cc As ControlCollection = PanelMain.Controls

For i As Integer = 0 To cc.Count - 1

ctrl = cc(i)

' do stuff with ctrl

Next

But you probably knew that anyway.

In short: The semantics of For Each specifically do not provide an

ordering - this makes IEnumerable very easy to implement, and indeed

makes it possible to implement where an ordering might actually be

impossible to define.

tb podes fazer algo do tipo:

with your groupbox name like:

[GroupBoxName].Controls

I assume this is groupbox1, so replace it with that.

Also, since you have an array - "x(5)", you can call the sort method of the array with on line of code to get the numbers in ascending order.  Then you can loop through the controls and set the text property.

--------------------------------

        'sort the array

        Array.Sort(x)

        'reset the counter

        i = 1

        For i = 1 To 6

            For Each ctrl In groupbox1.Controls

                'check the controls to see if they are a label and named label(i)

                If TypeOf ctrl Is textbox And ctrl.Name = "textbox" & i.ToString Then

                    ctrl.Text = x(i - 1)

                    Exit For

                End If

            Next

        Next

:thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Estranho, o 1º code que deste, não posso declarar a var cc como ali indica, dá erro:

Error 1 Option Strict On disallows implicit conversions from 'System.Windows.Forms.Control.ControlCollection' to 'System.Windows.Forms.Form.ControlCollection'.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Estranho, o 1º code que deste, não posso declarar a var cc como ali indica, dá erro:

Error 1 Option Strict On disallows implicit conversions from 'System.Windows.Forms.Control.ControlCollection' to 'System.Windows.Forms.Form.ControlCollection'.

vais ao teu projecto e carregas com o botão direito e seleccionas propriedades.

vais a compile e metes OPTION explicit a OFF.

Experimentas e depois voltas a colocar em ON (é aconselhavel ter a ON)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Coloquei em Off e dá o erro na mesma, nem deixa compilar aparece a janela a dizer There where build errors would you like to continue and run the last sucessful build ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para que complicar algo tão fácil!!!!


Public Class Form1
    Dim listadeTextboxs As List(Of TextBox) = New List(Of TextBox)


    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        listadeTextboxs.Add(TextBox1)
        listadeTextboxs.Add(TextBox2)
        listadeTextboxs.Add(TextBox3)
        listadeTextboxs.Add(TextBox4)
        listadeTextboxs.Add(TextBox5)
        listadeTextboxs.Add(TextBox6)
        listadeTextboxs.Add(TextBox7)
        listadeTextboxs.Add(TextBox8)
        listadeTextboxs.Add(TextBox9)
        listadeTextboxs.Add(TextBox10)




    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        For Each caixadetexto As TextBox In listadeTextboxs
            caixadetexto.Text = "texto que kiseres"
        Next
'OU
        For i As Integer = 1 To listadeTextboxs.Count
            listadeTextboxs(i).Text = "texto que kiseres"
        Next
    End Sub
End Class

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

SoulonFire

Aqui: Dim listadeTextboxs As List(Of TextBox) = New List(Of TextBox)

dá este erro: Error 1 Value of type 'System.Collections.Generic.List(Of System.Windows.Forms.TextBox)' cannot be converted to 'System.Collections.Generic.List(Of Microsoft.Office.Interop.Excel.TextBox)'.

e aqui: listadeTextboxs.Add(TextBox1)

dá este erro: Error 2 Option Strict On disallows implicit conversions from 'System.Windows.Forms.TextBox' to 'Microsoft.Office.Interop.Excel.TextBox'.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

SoulonFire

Aqui: Dim listadeTextboxs As List(Of TextBox) = New List(Of TextBox)

dá este erro: Error 1 Value of type 'System.Collections.Generic.List(Of System.Windows.Forms.TextBox)' cannot be converted to 'System.Collections.Generic.List(Of Microsoft.Office.Interop.Excel.TextBox)'.

e aqui: listadeTextboxs.Add(TextBox1)

dá este erro: Error 2 Option Strict On disallows implicit conversions from 'System.Windows.Forms.TextBox' to 'Microsoft.Office.Interop.Excel.TextBox'.

OK... visto k n estas a usar TextBoxs do System.Windows.Forms... faz assim que deve resolver o teu problema

Public Class Form1
    Dim listadeTextboxs As List(Of Microsoft.Office.Interop.Excel.TextBox) = New List(Of Microsoft.Office.Interop.Excel.TextBox)


    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        listadeTextboxs.Add(TextBox1)
        listadeTextboxs.Add(TextBox2)
        listadeTextboxs.Add(TextBox3)
        listadeTextboxs.Add(TextBox4)
        listadeTextboxs.Add(TextBox5)
        listadeTextboxs.Add(TextBox6)
        listadeTextboxs.Add(TextBox7)
        listadeTextboxs.Add(TextBox8)
        listadeTextboxs.Add(TextBox9)
        listadeTextboxs.Add(TextBox10)




    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        For Each caixadetexto As Microsoft.Office.Interop.Excel.TextBox In listadeTextboxs
            caixadetexto.Text = "texto que kiseres"
        Next
'OU
        For i As Integer = 1 To listadeTextboxs.Count
            listadeTextboxs(i).Text = "texto que kiseres"
        Next
    End Sub
End Class

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

estranho, é que usei as textboxes "normais" tipo, fui á toolbox, e carreguei no controlo Textbox e coloquei na minha form (no Panel2 neste caso).

Mas assim que chegar a casa testo o código novo, obrigado ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim mas caixas de texto normais são as "System.Windows.Forms.TextBox" as tuas são "Microsoft.Office.Interop.Excel.TextBox"

;) deve de ser algum problema de referencias!!! :biggrin:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

É capaz de ser disso pq neste proggy que tou a fazer, lê um ficheiro xls, e tive de chamar a referencia do microsoft excel...deve ser disso...assim que chegar a casa testo o code e dou feedback (só lá pras 17:30)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Dim txtnproc As List(Of Microsoft.Office.Interop.Excel.TextBox) = New List(Of Microsoft.Office.Interop.Excel.TextBox)

...

txtnproc.Add(TextBox1) <- dá erro: Error 1 Option Strict On disallows implicit conversions from 'System.Windows.Forms.TextBox' to 'Microsoft.Office.Interop.Excel.TextBox'.

O código está assim:

Option Explicit On
Option Strict On

Imports Microsoft.Office.Interop.Excel
Public Class Form1
    Dim txtnproc As List(Of Microsoft.Office.Interop.Excel.TextBox) = New List(Of Microsoft.Office.Interop.Excel.TextBox)

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture("en-US")
        Me.Text = My.Application.Info.Title & " " & My.Application.Info.Version.Major & "." & My.Application.Info.Version.Minor & "." & My.Application.Info.Version.Build
        txtnproc.Add(TextBox1)

    End Sub

(...)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora