2017-06-15 74 views
2

當我在我的項目中最大化一個表格並從中打開另一個表格時(使用按鈕),我收到了一個不尋常的故障,我只能使用下面的屏幕截圖來解釋。打開表格時出現不尋常的小故障

在這張圖片中,我有一個訂單屏幕和一個貨運屏幕。當我點擊'添加運費'按鈕時,訂單屏幕被最大化爲MDI屏幕,然後在打開貨運管理屏幕時,它將這兩個表單設置爲WindowState.Normal,我正在以編程方式進行操作,並且我明白爲什麼它將這兩個表單設置爲正常的窗口狀態,但是,您可以在最大化視圖中留下順序屏幕的跟蹤。

要解釋清楚,形式已經從WindowState.Maximized變更爲WindowState.Normal,圖像在左上角的形式是好的,但訂單在兩個標準化仍呈現和最大化,而是最大化的窗口不存在,當您移動其他屏幕時,它會消失。

最奇怪的是,我正在使用相同的代碼,以完全相同的方式在程序的其他地方打開其他窗口,但這種故障沒有發生。

只有2個「父」形式在打開其他表單時執行此操作。

還有其他人有過這個問題嗎?什麼是解決方法?即使我以最大化模式打開另一個表單也會發生這種情況,所以它不像在最大化視圖中打開它那麼簡單。

enter image description here

打開在示例形式的代碼如下:

ugProducts.UpdateData() 

    Try 
    Dim dt As New DataTable 
    dt = ugProducts.DataSource 

    Dim ordnum As Integer 
    Dim osql As New OleDbCommand 
    osql.CommandType = CommandType.Text 

    osql.Connection = con 
    osql.CommandText = "SELECT [Order_Number] FROM [Order_Freight] WHERE [Order_Reference] = ?" 
    osql.Parameters.AddWithValue("@onum", lblReference.Text.ToString) 

    ordnum = Convert.ToInt32(osql.ExecuteScalar) 

    Dim ORef As String 
    ORef = lblReference.Text 

    Dim FNumber As Integer 

    Dim fsql As New OleDbCommand 
    fsql.CommandType = CommandType.Text 

    fsql.Connection = con 
    fsql.CommandText = "SELECT [Freight_Number] FROM [Order_Freight] WHERE [Order_Reference] = ?" 
    fsql.Parameters.AddWithValue("@fnum", lblReference.Text.ToString) 

    FNumber = Convert.ToInt32(fsql.ExecuteScalar) 

    Dim PC As String 
    Try 
     PC = ugProducts.ActiveRow.Cells("Product_Code").Text.ToString 
    Catch 
     PC = ugProducts.Rows(0).Cells("Product_Code").Text.ToString 
    End Try 

    Dim SC As String 
    Try 
     SC = ugProducts.ActiveRow.Cells("Supplier_Code").Text.ToString 
    Catch 
      SC = ugProducts.Rows(0).Cells("Supplier_Code").Text.ToString 
    End Try 

    Dim f As New frmEditFreight(con, dt, Me, cmbCustCode.Text, ordnum, ORef, FNumber, PC, SC) 
    f.MdiParent = Me.MdiParent 
    f.Show() 

Catch ex As Exception 
    errorLog(ex) 

End Try 

然後,加載的形式,我有這個

Me.Location = New Point(0, 0) 
    Me.WindowState = FormWindowState.Normal 

    txtTotal.ReadOnly = True 
    lftable = New DataTable 

    If isNewOrder = False Then 
     Try 
      For Each dc As DataColumn In lineTable.Columns 
       If dc.ColumnName = "Order_Number" OrElse dc.ColumnName = "Product_Code" OrElse dc.ColumnName = "Supplier_Code" Then 
        lftable.Columns.Add(New DataColumn(dc.ColumnName, dc.DataType)) 
       End If 
      Next 

      Dim product As String = "" 
      Dim supplier As String = fOrder.cmbSupplier.Text 

      Dim ds As New DataSet 

      Dim da As New OleDbDataAdapter("SELECT * FROM [Order_Freight] WHERE [Order_Number] = ?", con) 
      da.SelectCommand.Parameters.Add("@num", OleDbType.Integer).Value = orderNum 
      da.Fill(ds) 
      Dim nDt As New DataTable 
      nDt = ds.Tables(0).Copy() 

      For Each row As DataRow In nDt.Rows 
       product = row.Item("Product_Code") 

       For Each dr As DataRow In lineTable.Rows 
        If dr.RowState <> DataRowState.Deleted Then 
         If dr.Item("Product_Code") = product Then 
          dr.Delete() 
         Else 
         End If 
        Else 
         If dr.Item("Product_Code", DataRowVersion.Original) = product Then 
          dr.Delete() 
         Else 
         End If 
        End If 
       Next 
      Next 

      For Each dr As DataRow In lineTable.Rows 
       If dr.RowState <> DataRowState.Deleted Then 
        dr.Item("Order_Number") = orderNum 
       End If 
      Next 

      Me.ugProducts.DataSource = lineTable 

      For Each dc As UltraGridColumn In ugProducts.DisplayLayout.Bands(0).Columns 
       Dim cName As String = dc.ToString 

       Select Case cName 
        Case "Product_Code" 
         dc.Hidden = False 
        Case "Order_Number" 
         dc.Hidden = False 
        Case "Supplier_Code" 
         dc.Hidden = False 
        Case Else 
         dc.Hidden = True 
       End Select 
      Next 

      loadAddresses(custCode, con) 

      dtEstDelivery.Value = Date.Today 

      ugProducts.DisplayLayout.Bands(0).Override.CellClickAction = CellClickAction.RowSelect 

      selectedTable.Columns.Add("Product_Code") 
      selectedTable.Columns.Add("Supplier_Code") 
      selectedTable.Columns.Add("RowIndex") 

      freightTable = New DataTable 

      With freightTable.Columns 
       .Add("Freight_Number") 
       .Add("Address_Code") 
       .Add("Est_Delivery") 
       .Add("Product_Code") 
       .Add("Freight_Desc") 
       .Add("Freight_Val", GetType(Decimal)) 
       .Add("Supplier_Code") 
       .Add("freeDelivery", GetType(Boolean)) 
      End With 

      ugFreight.DataSource = freightTable 

      ugSelected.DataSource = selectedTable 
      ugSelected.DisplayLayout.Bands(0).Override.CellClickAction = CellClickAction.RowSelect 

     Catch ex As Exception 
      errorLog(ex) 

     End Try 
    Else 
     Try 
      Me.ugProducts.DataSource = lineTable 

      For Each dc As UltraGridColumn In ugProducts.DisplayLayout.Bands(0).Columns 
       Dim cName As String = dc.ToString 

       Select Case cName 
        Case "Product_Code" 
         dc.Hidden = False 
        Case "Product_Description" 
         dc.Hidden = False 
         dc.Header.Caption = "Description" 
        Case "Supplier_Code" 
         dc.Hidden = False 
         dc.Header.Caption = "Supplier" 
        Case Else 
         dc.Hidden = True 
       End Select 
      Next 

      loadAddresses(custCode, con) 

      dtEstDelivery.Value = Date.Today 

      ugProducts.DisplayLayout.Bands(0).Override.CellClickAction = CellClickAction.RowSelect 

      selectedTable.Columns.Add("Product_Code") 
      selectedTable.Columns.Add("Supplier_Code") 
      selectedTable.Columns.Add("RowIndex") 

      freightTable = New DataTable 

      With freightTable.Columns 
       .Add("Freight_Number") 
       .Add("Address_Code") 
       .Add("Est_Delivery") 
       .Add("Product_Code") 
       .Add("Freight_Desc") 
       .Add("Freight_Val", GetType(Decimal)) 
       .Add("Supplier_Code") 
       .Add("freeDelivery", GetType(Boolean)) 
      End With 

      ugFreight.DataSource = freightTable 

      ugSelected.DataSource = selectedTable 
      ugSelected.DisplayLayout.Bands(0).Override.CellClickAction = CellClickAction.RowSelect 

     Catch ex As Exception 
      errorLog(ex) 

     End Try 
    End If 

    bLoading = False 

其次一些普通的東西,設置DataTables,加載數據等。

其遇到的問題的另一種形式具有這樣的代碼:

Try 
    Dim grid As UltraGrid = DirectCast(sender, UltraGrid) 
    Dim lastElement As UIElement = ugRates.DisplayLayout.UIElement.LastElementEntered 
    Dim rowElement As RowUIElement 

    If TypeOf lastElement Is RowUIElement Then 
     rowElement = DirectCast(lastElement, RowUIElement) 
    Else 
     rowElement = DirectCast(lastElement.GetAncestor(GetType(RowUIElement)), RowUIElement) 
    End If 

    If rowElement Is Nothing Then Return 

    Dim row As UltraGridRow = DirectCast(rowElement.GetContext(GetType(UltraGridRow)), UltraGridRow) 

    If (row Is Nothing) Then Return 

    Dim MousePosition As Point = grid.PointToClient(Control.MousePosition) 

    If Not lastElement.AdjustableElementFromPoint(MousePosition) Is Nothing Then Return 

Select Case row.Cells("cType").Value 
    Case "Acquisition Rate" 
     Dim supplier As String 

     If rbtnAllSuppliers.Checked = True Then 
      supplier = row.Cells("Supp_Code").Value 
     Else 
      supplier = cmbSupplier.Text 
     End If 

     Dim f As New frmCommission(con, row.Cells("Comm_Code").Value, supplier, True) 
     f.MdiParent = Me.MdiParent 
     f.Show() 

與下面的選擇殼體的其餘部分。在這種情況下被打開的形式,然後有代碼

Me.Location = New Point(0, 0) 
    Me.WindowState = FormWindowState.Normal 
    Me.Cursor = Cursors.Default 

    isUpdate = False 

    Me.ugComm.ContextMenuStrip = cmCommRate 

    With updateDT.Columns 
     .Add("Apply", GetType(Boolean)).DefaultValue = False 
     .Add("Product_Code") 
     .Add("Commission_Rate") 
     .Add("Multiplier") 
    End With 

    btnCustomerSearch.Enabled = False 

    Try 
     Dim da As New OleDb.OleDbDataAdapter 
     Dim ds As New DataSet 

     sql = "SELECT * FROM [System Settings]" 
     da = New OleDb.OleDbDataAdapter(sql, con) 

     Dim dt As New DataTable 
     da.Fill(dt) 

     If dt.Rows(0).Item("enableAqDate") = False Then 
      rbtnAcq.Enabled = False 
     End If 

     If cCode <> "" And sCode <> "" Then 
      cmbSupp.Text = sCode 
      cmbSupp_ValueChanged(sender, New EventArgs) 
     End If 

     disableControls() 

     cmbSupp.Refresh() 
     txtCommCode.Refresh() 
     ugComm.Refresh() 
     cmbSupp.Enabled = False 

     isLoad = False 

     If isEnquiry = True Then 
      txtCommCode.Text = cCode 
      loadEnquiry() 
      ugComm.Enabled = True 
      cmdAddRange.Enabled = False 
      cmdUpdateRange.Enabled = True 
      cmbSupp.Value = sCode 
      txtCommCode.Text = cCode 
     End If 

    Catch ex As Exception 
     errorLog(ex) 

    End Try 

當試圖插入建議作出dpiaware = True的代碼,我已經無法看到代碼的任何地方,這將去?

enter image description here

+0

你可以發佈你遇到問題的代碼嗎?雖然很奇怪,但我不得不爲這種情況添加Application.DoEvents(),因爲一種形式可能需要更多的內存,並且需要更多的時間來加載。 –

+3

你必須向我們展示創建這些表單的代碼。任何塗料代碼?任何調整大小的代碼? – LarsTech

+0

@JimmySmith代碼添加。 – David

回答

5

罪魁禍首似乎當活動的MDI子窗體最大化要在WindowState屬性設置爲NormalLoad事件MDI子窗體的內部。

此時目標窗體處於某種中間狀態 - 事件被稱爲窗口句柄創建的一部分,句柄已創建,Visible屬性爲True(但窗體並未真正顯示在屏幕上), WindowState返回Maximized,並試圖將其設置爲Normal從內部導致至ShowWindow API調用。

很難分辨出錯誤到底在哪裏(在Form類中有很多內部標誌和窗口消息處理),但最終效果是MDIClient和當前活動的mdi子窗體沒有正確無效,因此你正在經歷的視覺效果。

有了這樣說,有幾種替代方法:

(1)在形式被示出側:

移動Me.WindowState = FormWindowState.NormalShown事件。

(2)在主叫側:

(A)添加Me.WindowState = FormWindowState.Normal之前f.Show()

(B)添加Me.MdiParent.Invalidate(True)f.Show()

(C)加Me.MdiParent.Refresh()之後f.Show()

我個人的偏好是選項(1),因爲它封裝了一個特定於該窗體內被調用窗體的邏輯。