.Net usercontrol в MS Access - PullRequest
       10

.Net usercontrol в MS Access

3 голосов
/ 06 декабря 2010

Можно создать .Net UserControls, которые можно использовать в форме доступа VB6 / MS через COM, с помощью Interrop toolkit или в виде простого ActiveX .

Это работает довольно хорошо, за исключением одной серьезной проблемы: изменение размера .

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

Кажется, что нет способа укротить это поведение:

  • В .Net любая попытка изменить размер UserControl с помощью кода заканчивается неудачей.
  • В MS Access пользовательский элемент управления также не может изменять размер с помощью кода.

По-видимому, одним из решений может быть обернуть .Net Usercontrol в VB6 usercontrol .К сожалению, помимо адской необходимости использовать еще одну оболочку и специальный код, среда VB6 больше не доступна ...

Есть ли способ решить эту проблему?

Ответы [ 3 ]

1 голос
/ 16 июля 2015

Старая тема, я знаю, но у меня есть идея / работа, которая, кажется, работает прямо сейчас.
Не знаю, почему ....

С помощью .net com control

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

Все еще в тестировании, но похоже, что это может работать

1 голос
/ 16 ноября 2015

Я не уверен, почему MS Access и VB6 ведут себя по-разному, но я нашел работающее решение с использованием .Net Interop с C #. С VB.Net он тоже должен работать.

  1. Расширьте интерфейс IInteropUserControl следующей записью:

    void ResizeThis (int width, int height);

  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 Access вызовите функцию ResizeThis с соответствующими параметрами ширины и высоты.

  4. Есть еще одно странное поведение. При каждом перемещении записи в форме доступа UserControl уменьшается на несколько пикселей. Я решил эту проблему, переопределив функцию SetBoundsCore и реализовав свойство LockResizing. Этому свойству будет присвоено значение true, если размер UserControl не нужно изменять.

    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; }
    }
    

UserControl был протестирован с MS Access 2010 и 2016 (Office 365).

1 голос
/ 16 декабря 2010

Решение этой проблемы сложнее, чем предполагалось. Каждый раз, когда вы держите раствор, он проскальзывает у вас в руках ...

Простое решение описано на форумах MS VB: Взаимодействие UserControl в MSAccess .
Не идеально, но проще, чем тот, который я нашел.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...