2016-06-27 3 views
0

Я задал вопрос here и после многих попыток я принял ответ, который предложил мне использовать скрытый элемент управления вместо добавленного элемента управления.Динамически добавленный элемент управления (DataGridView) не работает должным образом

Таким образом, мой код работает правильно, но я хотел бы понять ошибку.

Вот что происходит: При нажатии кнопки добавляется новый DataGridView, но
а) не видно, даже если его свойство видимым установлено True;
b) если (в то время как добавленный DGV находится в форме), я установил свойство DGV, видимое False, а затем я снова установил его в значение True, когда отображается DGV, но столбцы не изменяются;
c) Если я удалю добавленный DGV и снова его добавлю, он снова станет невидимым.

ВСЕ ЭТИ ПРОБЛЕМЫ НЕ БЫВАЕТ Если я запускаю ДРУГОЙ SUB

Если:
а) Я бегу к югу, скрывающий свою первую форму и показывает другую форму;
b) затем я закрываю вторую форму, чтобы вернуться к первой форме;
все работает нормально:
DGV правильно добавлен;
видно;
все столбцы правильно изменены;
Если я удалю DGV или его снова добавлю, все будет работать.

Пожалуйста, покажите мне, где я ошибаюсь.

+0

Какой код для добавления DGV? – Aimnox

+0

@Aimnox Весь код в моем другом вопросе. Я дал ссылку в начале этого вопроса. – genespos

+0

Попробуйте добавить «Me.Hide() Me.Show()» в 1-й форме после создания DataGridView, чтобы увидеть, если это действительно из-за скрыть/показать процесс формы 1? – HaPhan

ответ

0

Это код, который я получил от вашей предыдущей ссылки. Он отображает datagridview, как и ожидалось в моей форме. Как вы можете видеть, это именно ваш код, за исключением этого «использования» блока --- и способ получения данных. Это единственные различия.

Private Sub ShowHideTbl() 
    Dim DTemp As DataTable = GetTable() 
    Dim DGV_Tbl As DataGridView = Nothing 
    Try 
     DGV_Tbl = CType(Me.Controls("DGV_Tbl"), DataGridView) 
    Catch ex As Exception 
     MsgBox(ex.ToString) 
    End Try 
    If DGV_Tbl Is Nothing Then 
     If Me.CBox_ProcType.Text = "Select a Procedure" Then 
      MsgBox("You need To select a Procedure", vbInformation, "Unable to show table") 
      Exit Sub 
     End If 
    End If 
    DGV_Tbl = New DataGridView 
    With DGV_Tbl 
     .Name = "DGV_Tbl" 
     .DataSource = DTemp 
     Me.Controls.Add(DGV_Tbl) 
     .AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells) 
     .RowHeadersVisible = False 
     .AllowUserToAddRows = False 
     .AllowUserToDeleteRows = False 
    End With 
    Dim DGV_H As Integer = 0 
    Dim DGV_W As Integer = 0 
    For Each S As DataGridViewRow In DGV_Tbl.Rows 
     DGV_H += S.Height 
    Next 
    DGV_H += DGV_Tbl.ColumnHeadersHeight 
    'Add more space to include spaces between cells 
    DGV_H += CInt(DGV_Tbl.Rows.Count * 0.45) 
    For Each S As DataGridViewColumn In DGV_Tbl.Columns 
     DGV_W += S.Width 
    Next 
    'Add more space to include spaces between cells 
    DGV_W += CInt(DGV_Tbl.Columns.Count * 0.45) 
    DGV_Tbl.Height = DGV_H 
    DGV_Tbl.Width = DGV_W 
    'Resize the Form 
    Me.Height += DGV_H + 30 
    Me.Controls("DGV_Tbl").Location = New Point(15, Me.Height - DGV_H - 30) 
End Sub 

Ваша проблема является наиболее странным, и так как у меня нет кода, чтобы попробовать и проверить, что я только предположить, что вы вставить этот код в новую форму, увидеть, если он работает. Если это так, добавьте в него другой элемент управления формы 1, снова запустите код, посмотрите, работает ли он еще. Повторяйте процесс, пока не выясните, в чем причина.

Я считаю, что вы можете узнать, что на самом деле происходит в вашей форме с этим. Кто знает, что новая форма, вероятно, сработает.

Смежные вопросы