array de botones

08/06/2005 - 03:52 por Alvaro Urrutia | Informe spam
buenas. necesito saber como poder realizar un arreglo de botones, tengo un
formulario donde necesito poner mas de veinte botones, para si
posteriormente utilizar algun ciclo for, en vb6.0 era facil pero en .net,
aun no se como hacerlo, he visto algunos ejemplos en buscadores pero la
explicacion es sumamente engorrosa y poco comprensible, quien pueda
ayudarme porfavor con algun ejemplo. gracias. alvaro

Preguntas similare

Leer las respuestas

#1 Carlos Durán Urenda
08/06/2005 - 16:13 | Informe spam
en .Net no existen los arreglos de controles

El Arreglo en VB6 lo podias utilizar para dos cuestiones...

1) poner un codigo generico para todos los controles del arreglo
Esto se puede lograr con la sentencia Handles ...

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) _
Handles Button1.Click, Button2.Click, Button3.Click,
Button4.Click ... etc

Dim B As Button = DirectCast(sender, Button)
Select Case B.Name
Case "Button1"
...

End Select

2) Utilizar la matriz para establecer una propiedad de todos los elementos
de la matriz
por ejemplo desactivar todos los controles de la matriz

Podrias crear un arreglo e incluir todos los botones en el y recorrerlo
mediante un cilco
o bien recorrer los controles del objeto contenedor y discriminar por tipo
de control

Dim C As Control
For Each C In Me.Controls
If TypeOf C Is Button Then
C.Enabled = Not C.Enabled ' o bien true o false
End If
Next


Saludos
Carlos Durán





"Alvaro Urrutia" escribió en el mensaje
news:
buenas. necesito saber como poder realizar un arreglo de botones, tengo un
formulario donde necesito poner mas de veinte botones, para si
posteriormente utilizar algun ciclo for, en vb6.0 era facil pero en .net,
aun no se como hacerlo, he visto algunos ejemplos en buscadores pero la
explicacion es sumamente engorrosa y poco comprensible, quien pueda
ayudarme porfavor con algun ejemplo. gracias. alvaro

Respuesta Responder a este mensaje
#2 Tristan
10/06/2005 - 01:12 | Informe spam
En realidad la única diferencia importante entre vb6 y vb.net en cuanto a
los arrays de controles, es que mientras que vb6 obliga a utilizar una
estructura concreta y muy limitada para mantener el array, vb.net admite
cualquier estructura de datos.

Otra pequeña diferencia es que en .net, el diseñador de windows forms, no
hace ningún trabajo a la hora de crear el array de controles. Se tiene que
crear por código. Pero vamos, es extremadamente sencillo:

Dim botones(4) As Button
For i As Integer = 0 To 4
Dim boton As Button = New Button
boton.Text = "Botón" & i.ToString()
boton.Location = New Point(0, i * boton.Height)
botones(i) = boton
Next
Me.Controls.AddRange(botones)


Si no se quieres crear los controles por código sino aprovechar el trabajo
del diseñador, basta con asignar los botones ya existentes a un array:

dim botones() as Button = {Button1, Button2, Button3, ...}

Una vez en el array, se pueden hacer las mismas cosas que con los
tradicionales arrays de vb.

Una de las muchas ventajas, es que en .net, el array puede ser de cualquier
tipo. No necesariamente limitado a botones. Pueden combinarse controles de
diversos tipos.


Para tratar eventos, es también sencillo. A partir del segundo ejemplo:

for each boton as button in botones
AddHandler boton.Click, AddessOf Button1_Click
next

Donde Button1_Click podría ser la rutina de evento Click del botón Button1,
a la que quitamos la parte del "Handles Button1.Click"


Juan Carlos Badiola
MVP - C#
Respuesta Responder a este mensaje
#3 Eduardo A. Morcillo [MS MVP VB]
10/06/2005 - 04:31 | Informe spam
Yo he creado este simple componente para asignar controles a una coleccion
desde el diseñador, teniendo en cuenta que se pueden juntar controles de
diferentes tipos (a diferencia de VB6). Simplemente colocas el componente en
el formulario y este agregara una propiedad a cada control que indica si se
agrega o no el control a la coleccion. Se pueden poner tantas colecciones
como se quieran e incluso el mismo control a varias colecciones.

Option Explicit On
Option Strict On

Imports System
Imports System.Collections
Imports System.ComponentModel
Imports System.Windows.Forms

Namespace Edanmo.Windows.Forms

<ProvideProperty("Add", GetType(Control))> _
Public Class ControlCollection
Inherits ReadOnlyCollectionBase
Implements IComponent, IExtenderProvider

Private _disposed As Boolean
Private _site As ISite

Public Event Disposed As EventHandler Implements _
System.ComponentModel.IComponent.Disposed

Public Sub New()
End Sub

Public Sub New(ByVal container As IContainer)
container.Add(Me)
End Sub

Public Sub Add(ByVal control As Control)
If _disposed Then Throw New ObjectDisposedException(Me.ToString)
innerlist.Add(control)
End Sub

Public Sub Clear()
If _disposed Then Throw New ObjectDisposedException(Me.ToString)
innerlist.Clear()
End Sub

Public Sub CopyTo(ByVal array() As Control, _
ByVal index As Integer)
DirectCast(Me, ICollection).CopyTo(array, index)
End Sub

<EditorBrowsable(EditorBrowsableState.Never), _
Category("Control Collections"), _
DefaultValue(False)> _
Public Function GetAdd(ByVal control As Control) As Boolean
Return innerlist.Contains(control)
End Function

Public Sub Remove(ByVal control As Control)
If _disposed Then Throw New ObjectDisposedException(Me.ToString)
InnerList.Remove(control)
End Sub

Public Sub RemoveAt(ByVal index As Integer)
If _disposed Then Throw New ObjectDisposedException(Me.ToString)
InnerList.RemoveAt(index)
End Sub

<EditorBrowsable(EditorBrowsableState.Never), _
Category("Control Collections")> _
Public Sub SetAdd(ByVal control As Control, _
ByVal value As Boolean)

If value Then
InnerList.Add(control)
Else
InnerList.Remove(control)
End If

End Sub

Protected Sub Dispose(ByVal disposing As Boolean)

If disposing Then
' nothing to dispose here
End If

MyBase.InnerList.Clear()

_disposed = True

RaiseEvent Disposed(Me, EventArgs.Empty)

End Sub

Protected Overrides Sub Finalize()
Try
Dispose(False)
Finally
MyBase.Finalize()
End Try
End Sub

Private Function CanExtend(ByVal extendee As Object) As Boolean _
Implements System.ComponentModel.IExtenderProvider.CanExtend

Return TypeOf extendee Is Control

End Function

Private Sub Dispose() Implements System.IDisposable.Dispose
Dispose(True)
GC.SuppressFinalize(Me)
End Sub

Default Public Property Item(ByVal index As Integer) As Control
Get
If _disposed Then Throw New
ObjectDisposedException(Me.ToString)
Return DirectCast(innerlist.Item(index), Control)
End Get
Set(ByVal value As Control)
If _disposed Then Throw New
ObjectDisposedException(Me.ToString)
innerlist.Item(index) = value
End Set
End Property

Private Property Site() As System.ComponentModel.ISite _
Implements System.ComponentModel.IComponent.Site
Get
Return _site
End Get
Set(ByVal value As System.ComponentModel.ISite)
_site = value
End Set
End Property

End Class

End Namespace


Eduardo A. Morcillo [MS MVP VB]
http://www.mvps.org/emorcillo
Respuesta Responder a este mensaje
#4 Tristan
10/06/2005 - 08:43 | Informe spam
¡Magnífico, Eduardo! ¡Me parece una idea soberbia! :-)

Juan Carlos Badiola
MVP - C#
Respuesta Responder a este mensaje
#5 Eduardo A. Morcillo [MS MVP VB]
10/06/2005 - 17:02 | Informe spam
¡Magnífico, Eduardo! ¡Me parece una idea soberbia! :-)



Todo gracias a IExtenderProvider porque sino seria mucho mas complicado.

Eduardo A. Morcillo [MS MVP VB]
http://www.mvps.org/emorcillo
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida