2010-12-06 35 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 

还在测试,但看起来它可能工作