Ссылка на несвязанный DataGridView без указания его имени? - PullRequest
0 голосов
/ 16 марта 2012

Я использую 3 несвязанных элемента управления DataGridView для отображения определенной информации. Чтобы загрузить информацию в эти DGV, я извлекаю информацию из зашифрованного файла, расшифровываю ее, анализирую информацию и пытаюсь заполнить DGV этой информацией. Загрузка из файла вызывается нажатием пункта меню. Вот что у меня есть:

Private Sub miCLoad_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) 
    Handles miCLoad.Click
    Dim FilePath As String = "C:\FList\CList.clt"
    Dim LoadFile As New SaveandLoad.SaveAndLoad
    Dim FileRead As New Simple3Des("MyPassword")
    Dim FileString As String = FileRead.ReadFile(FilePath)


    With LoadFile
        .WhichList = dgCourses
        .FilePath = FilePath
        .DecryptedString = FileRead.DecryptData(FileString)
        .dgList = dgCourses
    End With

    Call LoadFile.LoadFile()
End Sub

Public Class SaveandLoad
Public Property WhichList As New DataGridView
Public Property FilePath As String
Public Property DecryptedString As String
Public Property EncryptedString As String
Public Property dgList As Control

Public Sub LoadFile()

    Dim dgRow As DataGridViewRow
    Dim dgCell As DataGridViewTextBoxCell
    Dim Lines() As String = DecryptedString.Split(vbLf)
    Dim LinesList As List(Of String) = Lines.ToList
    LinesList.RemoveAt(Lines.Length - 1)

    For Each Line As String In LinesList
        Dim Fields() As String = Line.Split(",")
        dgRow = New DataGridViewRow

        For x = 0 To (WhichList.Columns.Count - 1) Step 1
            dgCell = New DataGridViewTextBoxCell
            dgCell.Value = Fields(x).ToString
            dgRow.Cells.Add(dgCell)
        Next
        WhichList.Rows.Add(dgRow)
    Next

    Select Case WhichList.Name
        Case "dgCourses"
            frmFacultyList.dgCourses = WhichList
            frmFacultyList.dgCourses.Refresh()
            WhichList.Dispose()
        Case "dgFList"
            frmFacultyList.dgFList = WhichList
            frmFacultyList.dgFList.Refresh()
            WhichList.Dispose()
        Case "dgSList"
            frmFacultyList.dgSList = WhichList
            frmFacultyList.dgSList.Refresh()
            WhichList.Dispose()
    End Select

    MsgBox("List Successfully Loaded", vbOKOnly, "Load")

End Sub

Я хочу иметь возможность ссылаться (или заполнять) на DGV без использования операторов 'select case' или 'if-then'. Это будет слишком неэффективно, как только я начну добавлять множество других DGV, которые будут добавлены в будущем. Поэтому заголовок - главный вопрос. Я использую VS Express 2010.

Ответы [ 2 ]

0 голосов
/ 17 марта 2012

Вот что сработало для меня в VB.NET:

Dim FormControls As New frmFacultyList.ControlCollection(frmFacultyList)

        For Each DGV As DataGridView In FormControls
            If WhichList.Name = DGV.Name Then
                DGV = WhichList
                DGV.Refresh()
            End If
        Next

Создайте экземпляр коллекции элементов управления, затем найдите специально для DGV, используя For Each.Просто и эффективно.

0 голосов
/ 16 марта 2012

Я не знаю VB слишком много, однако, я опубликую свое решение на C # (может быть полезным в некотором роде ....)

DataGridView myDGV;
foreach (var item in this.Controls)
{
    if (item.GetType() == typeof(DataGridView))
    {
        if (((DataGridView)item).Name == WhichList.Name)
        {
            //Cannot assing to 'item' here,  because it is a 'foreach iteration variable'
            //However you can save the variable for later use.
            myDGV = (DataGridView)item;
        }
    }
}
myDGV = WhichList;




// different approach
DataGridView myDGV = (DataGridView)this.Controls.Find(WhichList.Name, false).First();
myDGV = WhichList;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...