문제

아마도 저는 아직 .NET에 대해 충분히 알지 못하지만 이 간단한 VB6 코드를 .NET에서 쉽게 구현하는 만족스러운 방법을 아직 본 적이 없습니다. 이 코드는 Command1() 및 N 배열에 N CommandButton이 있는 폼에 있다고 가정합니다. 배열 Text1())의 텍스트 상자:

Private Sub Command1_Click(Index As Integer)

   Text1(Index).Text = Timer

End Sub

그다지 유용한 코드는 아니지만 VB6에서 컨트롤 배열을 쉽게 사용할 수 있음을 보여줍니다.C# 또는 VB.NET에서 가장 간단한 것은 무엇입니까?

도움이 되었습니까?

해결책

일반적인 텍스트 상자 목록을 만듭니다.

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;
}

다른 팁

VB .NET의 또 다른 장점은 여러 컨트롤을 처리하는 단일 이벤트 핸들러가 있다는 것입니다.

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

        TextBox2.TextChanged, _

        TextBox3.TextChanged

End Sub

없다 진짜 .Net의 1:1 아날로그.물론, 특정 유형의 컨트롤 배열이나 목록을 만들 수 있지만 자동으로 해당 작업을 수행할 수 있는 것은 없습니다.

그러나 .Net에서 리팩토링할 수 없는 컨트롤 배열을 본 적이 없습니다. 더 나은.적절한 사례가 귀하의 예입니다.게시한 시나리오에서는 컨트롤 배열을 사용하여 버튼과 텍스트 상자를 연결하고 있습니다..Net에서는 아마도 사용자 정의 컨트롤을 사용하여 이 작업을 수행할 것입니다.사용자 정의 컨트롤은 버튼, 텍스트 상자 및 공유/정적 타이머로 구성됩니다.양식은 이 사용자 정의 컨트롤의 여러 인스턴스를 사용합니다.컨트롤에 필요한 로직을 한 번 구현하면 더 큰 양식 클래스와 병합할 필요 없이 소스 제어에서 추적 및 편집할 수 있거나 여러 양식 또는 여러 프로젝트에서 쉽게 재사용할 수 있는 자체 소스 파일로 격리됩니다. .또한 명령 단추 색인이 텍스트 상자 색인과 일치하는지 확인하는 것에 대해 걱정할 필요가 없습니다.

이를 위해 컨트롤 배열 대신 사용자 지정 컨트롤을 사용하는 것은 인덱스 대신 이름을 얻는다는 점에서 배열 대신 클래스를 사용하여 데이터를 그룹화하는 것과 대략 유사합니다.

두 가지 측면이 있습니다.

.NET은 컨트롤 배열을 쉽게 지원하지만 VB6은 해결 방법을 사용해야 했습니다. 그렇지 않으면 이벤트 연결이 정말 어려웠기 때문입니다..NET에서는 이벤트를 동적으로 연결하는 것이 쉽습니다.

그러나 .NET 양식 디자이너는 다음과 같은 간단한 이유로 컨트롤 배열을 지원하지 않습니다.컨트롤 배열은 런타임에 생성/확장됩니다.컴파일 타임에 얼마나 많은 컨트롤이 필요한지 알고 있다면(이론에 따르면) 컨트롤에 다른 이름을 지정하고 배열에 넣지 않습니다.

그다지 유용한 코드는 아닌 것으로 알고 있습니다.

그것이 바로 요점입니다.쓸모없는 기능을 왜 가지고 있나요?

필요한 경우 이름으로 컨트롤에 액세스할 수도 있으며 결과는 다음과 같습니다.

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의 호환성 라이브러리에는 강력한 형식의 컨트롤 배열이 포함되어 있습니다.이는 업그레이드 마법사가 현재 VB6 제어 배열을 교체하는 데 사용하는 것입니다.

그러나 VB6의 컨트롤 배열은 표면적으로 몇 가지 구문 마법을 수행하는 VB6의 개체 모음일 뿐입니다..NET 세계에서는 이를 제거함으로써 더 나은 관행을 강요하고 있습니다.

마지막으로, 제네릭의 출현으로 인해 사용을 막을 수 있는 것은 아무것도 없습니다.

List<YourControl> MyControlArray.

컨트롤 배열을 만듭니다.

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

동일한 클릭 이벤트는 .Net의 여러 버튼에서 버튼 누르기를 처리할 수 있습니다.그런 다음 태그 속성에서 찾을 텍스트 상자를 추가할 수 있습니까?

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

VB6의 컨트롤 배열의 두 가지 주요 이점은 다음과 같습니다.(1) 그들은 당신이 컨트롤 모음을 통해 반복 할 수있는 방법을 제공했습니다 (2) 그들은 당신이 컨트롤간에 이벤트를 공유 할 수있게 해주었다.

(1) 하나의 컨트롤 배열을 사용하여 .NET에서 달성 될 수 있습니다 (2)는 하나의 이벤트를 다중 컨트롤을 처리하여 달성 할 수 있습니다 (구문은 사용하기 때문에 구문은 약간 다릅니다. sender 대신에 논쟁 myArray(index)).

.Net의 좋은 점 중 하나는 이러한 기능이 분리되어 있다는 것입니다.예를 들어 배열의 일부가 아니고 이름이나 유형이 다른 경우에도 이벤트를 공유하는 컨트롤을 가질 수 있습니다.그리고 완전히 다른 이벤트가 있는 경우에도 컨트롤 컬렉션을 반복할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top