2010-12-06 43 views
3

可以通過COM,在Interrop toolkit的幫助下或通過簡單的ActiveX創建可以在VB6/MS Access窗體上使用的.Net UserControls。。MS Access中的Net usercontrol

這個效果很好,除了一個主要的痛苦:resizing

您無法在運行時調整窗體上的控件大小。
錨定的形式使得它成長每次調整窗體時,即使你減少的形式控制兩側...

似乎沒有要任何方式馴服此行爲:

  • 從.Net,通過代碼調整UserControl的任何嘗試失敗。
  • 從MS Access來說,用戶控件不能通過代碼調整大小。

顯然,一種解決方案可能是wrap the .Net Usercontrol in a VB6 usercontrol。 不幸的是,旁邊的地獄,不得不使用另一個包裝和更多的特設代碼,VB6 IDE不再可用...

有沒有什麼辦法可以解決這個問題?

回答

1

我不確定爲什麼MS Access和VB6行爲不同y,但我發現了一個使用.Net Interop和C#的工作解決方案。使用VB.Net它也應該可以工作。

  1. 擴展IInteropUserControl接口與以下項:

    空隙ResizeThis(INT寬度,高度INT);

  2. 貫徹ResizeThis功能:

    public void ResizeThis(int width, int height) 
    { 
        this.UpdateBounds(Left, Top, width, height); 
        this.SetBounds(0, 0, width + 1, height + 1, BoundsSpecified.Width | BoundsSpecified.Height); 
    } 
    
  3. 在MS訪問調用ResizeThis功能與適當的寬度和高度參數。

  4. 還有一種奇怪的行爲。在Access窗體中的每個記錄移動中,UserControl會縮小一些像素。我通過重寫SetBoundsCore函數並實現一個屬性LockResizing來解決此問題。當UserControl不應調整大小時,該屬性將被賦值爲true。

    protected override void SetBoundsCore(int x, int y, int width, int height, BoundsSpecified specified) 
    { 
        if (_LockResizing) 
         throw new Exception(); 
    
        base.SetBoundsCore(x, y, width, height, specified); 
    } 
    
    public bool LockResizing 
    { 
        get { return _LockResizing; } 
        set { _LockResizing = value; } 
    } 
    

的用戶控件用MS訪問2010和2016(辦公室365)測試。

1

解決此問題比預期更復雜。每當你拿着一個解決方案時,它就會滑過你的手......

一個簡單的解決方案記錄在VB MSDN論壇:Interop UserControl in MSAccess
不完美,但比我發現的更簡單。

主要問題是Access會擦除控件的大區域。
如果控件固定在右邊和底邊上,那不是問題,否則,可以在子窗體或標籤控件頁中使用該控件,而不顯示標籤,因此它充當容器。

+0

爲什麼你認爲你需要這樣做?它似乎過於複雜,可能不穩定/不可撤銷。如果您需要在Access中構建前端,請使用Access提供的控件在Access中構建它,並學習如何處理Access的限制。如果你這樣做,你的頭髮會少得多! – 2010-12-19 01:50:58

+2

。與Access的Net互操作性在所有領域都非常出色,除了這個奇怪的問題。 – 2010-12-20 18:40:56

1

舊主題我知道,但我有一個想法/工作,似乎現在正在工作。
不知道爲什麼....

在.NET中使用COM控件

Private _ForceWidth As Integer = 0 
Private _ForceHeight As Integer = 0 

Public Property ForceWidth As Integer 
    Get 
     Return _ForceWidth 
    End Get 
    Set(value As Integer) 
     _ForceWidth = value 
    End Set 
End Property 


Public Property ForceHeight As Integer 
    Get 
     Return _ForceHeight 
    End Get 
    Set(value As Integer) 
     _ForceHeight = value 
    End Set 
End Property 



Private Sub MyControl_Resize(sender As Object, e As EventArgs) Handles MyBase.Resize 
    If ForceWidth > 0 Then 
     Me.Width = ForceWidth 
    End If 
    If ForceHeight > 0 Then 
     Me.Height = ForceHeight 
    End If 
End Sub 

在艾策斯表格

Private Sub Form_Current() 
    MyControl1.ForceWidth = 800 
    MyControl1.ForceHeight = 600 
    MyControl1.Width = SignatureControl6.Width - 1 'force sending resize message 
End Sub 

還在測試,但看起來它可能工作