Pergunta

Talvez eu apenas não sei .NET bem o suficiente ainda, mas eu ainda tenho que ver uma maneira satisfatória para implementar este simples código do VB6 facilmente .NET (suponha que este código está em um formulário com N CommandButtons na matriz Command1() e N caixas de Texto na matriz Texto1()):

Private Sub Command1_Click(Index As Integer)

   Text1(Index).Text = Timer

End Sub

Eu sei que não é muito útil, código, mas demonstra a facilidade com que as matrizes de controle pode ser usado em VB6.O que é o mais simples equivalente em C# ou VB.NET?

Foi útil?

Solução

Faça uma lista genérica de caixas de texto:

var textBoxes = new List<TextBox>();

// Create 10 textboxes in the collection
for (int i = 0; i < 10; i++)
{
    var textBox = new TextBox();
    textBox.Text = "Textbox " + i;
    textBoxes.Add(textBox);
}

// Loop through and set new values on textboxes in collection
for (int i = 0; i < textBoxes.Count; i++)
{
    textBoxes[i].Text = "New value " + i;
    // or like this
    var textBox = textBoxes[i];
    textBox.Text = "New val " + i;
}

Outras dicas

Outra coisa legal que o VB .NET faz é ter um único manipulador de eventos que lida com vários controles:

Private Sub TextBox_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) _ 
        Handles TextBox1.TextChanged, _

        TextBox2.TextChanged, _

        TextBox3.TextChanged

End Sub

Não há real 1 para 1 entrada analógica .Líquida.Com certeza, você pode fazer matrizes ou listas de controles de um tipo específico, mas não há nada que vai fazer isso para você automaticamente.

No entanto, eu nunca vi uma matriz de controle que não poderia ser reformulada em .Net para algo melhor.Um caso em questão é o seu exemplo.No cenário em que você postou, você está usando o controle de matrizes a par de um botão com uma caixa de texto.Em .Net, você provavelmente iria fazer isso com um controle personalizado.O controle personalizado consistiria de um botão, uma caixa de texto, e talvez um shared/estático temporizador.O formulário utiliza várias instâncias do controle personalizado.Implementar a lógica necessária para o controlo de uma vez, e é isolado em seu próprio arquivo de origem que podem ser rastreados e editado no controle de origem sem a necessidade de uma impressão em série com a maior classe de formulário, ou facilmente re-utilizada em várias formas, ou até mesmo em vários projetos.Você também não precisa se preocupar sobre certificando-se de que o botão de comando índice corresponde com a caixa de texto índice.

Usando um controle personalizado para este, em vez de uma matriz de controle é vagamente semelhante a utilizar a classe para agrupar dados em vez de uma matriz, em que você obter os nomes em vez dos índices.

Há dois aspectos.

.NET prontamente oferece suporte a matrizes de controles, VB6 só tinha de usar uma solução, pois caso contrário, cabos de eventos foi muito difícil.Em .REDE, cabeamento de eventos dinamicamente é fácil.

No entanto, o .NET designer de formulário não oferece suporte a matrizes de controle por uma simples razão:matrizes de controles são criados/estendido em tempo de execução.Se você souber como muitos controles que você precisa em tempo de compilação (o raciocínio vai), em seguida, dar-lhes nomes diferentes, e não colocá-los em uma matriz.

Eu sei que não é muito útil, código

Que é exatamente o ponto.Por ter uma característica se de que é inútil?

Se necessário, você também pode acessar um controle por nome, resultando em algo como isto:

Private Sub Command_Click(sender As Object, e As EventArgs) Handles Command1.Click, Command2.Click …
    Dim name As String = DirectCast(sender, Control).Name
    Dim index As Integer = Integer.Parse(name.Substring("Command".Length))
    Controls(String.Format("Text {0}", index)).Text = Timer.Value.ToString()
End Sub

VisualBasic .NET biblioteca de compatibilidade contém fortes escreveu matrizes de controle.Isto é o que o assistente de atualização usa para substituir o atual VB6 matrizes de controle.

No entanto, Uma matriz de controle em VB6 é apenas uma coleção de objetos com VB6 fazendo algumas sintaxe magia na superfície.No .Rede mundial, removendo isso, eles estão forçando melhores práticas.

No fechamento, com o advento dos genéricos, não há nada que impeça você de usar

List<YourControl> MyControlArray.

Criar um array de controles.

TextBox[] textboxes = new TextBox[] {
    textBox1,
    textBox2,
    textBox3
};

O mesmo evento de clique pode lidar com o pressiona o botão de vários botões .Líquida.Em seguida, você pode adicionar a caixa de texto para encontrar a propriedade de Marca?

Private Sub AllButton_Click(sender As Object, e As EventArgs) Handles Button1.Click, Button2.Click, Button3.Click
  Dim c As Control = CType(sender, Control)
  Dim t As TextBox = FindControl(CType(c.Tag, String))
  If t Is Not Nothing Then
     t.Text = "Clicked"
  End If
End Sub

Os dois principais benefícios de matrizes de controle em VB6 foram:(1) forneceu um caminho para que você iterar através de uma coleção de controles (2) Eles permitiram-lhe partilhar eventos entre controles

(1) pode ser feito .Net usando uma matriz de controles (2) pode ser realizado por ter um identificador de evento vários controles (a sintaxe é um pouco diferente porque você use o sender argumento em vez de myArray(index)).

Uma coisa legal .Net é que esses recursos são dissociadas.Assim, por exemplo, você pode ter controles que compartilhar eventos, mesmo se eles não são parte de uma matriz e têm nomes diferentes e até mesmo um tipo diferente.E você pode iterar através de um conjunto de controles, mesmo se eles têm totalmente diferentes eventos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top