Я пытаюсь создать пользовательский элемент управления для SAP b1 с помощью ActiveX.
- Я создал Windows Библиотека элементов управления Forms
- Сделано Информация о сборке проекта COM-Visible (Свойства проекта = > Application => Информация о сборке)
- Зарегистрировано для взаимодействия COM (Свойства проекта => Build)
Мой UserControl выглядит так:
[ComVisible(false)]
public delegate void OnCheckBoxClickEventHandler(string val);
[ProgId("MyComLib.Controls.TextBoxCheck")]
[ClassInterface(ClassInterfaceType.None)]
[ComSourceInterfaces(typeof(ITextBoxCheckEvents))]
public partial class TextBoxCheckClass : UserControl, TextBoxCheck
{
public string PlaceHolder
{
get
{
return textBox1.Text;
}
set
{
textBox1.Text = value;
}
}
public TextBoxCheckClass()
{
InitializeComponent();
}
public event OnCheckBoxClickEventHandler OnCheckBoxClick;
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
textBox1.ReadOnly = checkBox1.Checked;
OnCheckBoxClick?.Invoke(textBox1.Text);
}
private void TextBoxCheck_Load(object sender, EventArgs e)
{
textBox1.Text = PlaceHolder;
}
[ComRegisterFunction()]
private static void RegisterClass(string key)
{
Registrar.RegisterClass(key, "MyComLib.Controls.TextBoxCheck");
}
[ComUnregisterFunction()]
private static void UnregisterClass(string key)
{
Registrar.UnregisterClass(key);
}
}
Используемые мной интерфейсы:
[Guid("5710FC13-103E-48F4-B674-80DDD3ABA0DB")]
public interface TextBoxCheck : ITextBoxCheck, ITextBoxCheckEvents_Event
{
}
[Guid("3AF22B4A-A941-4DBF-8ED5-EB6DAFF538E5")]
public interface ITextBoxCheck
{
[DispId(1)]
string PlaceHolder { get; set; }
}
[Guid("64C6CEC1-B855-4B7C-B2C8-31F7879DEA4E")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface ITextBoxCheckEvents
{
[DispId(1)]
void OnCheckBoxClick(string val);
}
//[ComEventInterface(typeof(ITextBoxCheckEvents), typeof(ITreeViewEvents_EventProvider))]
[Guid("3DB40F69-E503-4CE2-8696-0349CC41114B")]
public interface ITextBoxCheckEvents_Event
{
[DispId(1)]
event OnCheckBoxClickEventHandler OnCheckBoxClick;
}
SAP b1 Код расширения:
var classId = "MyComLib.Controls.TextBoxCheck";
var newItem = form.Items.Add("ActiveX1Id", BoFormItemTypes.it_ACTIVE_X);
var activeXControl = newItem.Specific as ActiveX;
activeXControl.ClassID = classId;
var myItem1 = activeXControl.Object as TextBoxCheck;
myItem1.PlaceHolder = "test1";
//getting error on this line
myItem1.OnCheckBoxClick += (val) =>
{
//some code;
};
Но когда я при использовании этого элемента управления в моем аддоне SAP b1 я получаю ошибку:
{"Невозможно привести объект типа 'System .__ ComObject' к типу MyComLib.Controls.OnCheckBoxClickEventHandler '."}
Если есть хороший пример, который описывает, как экспортировать dll в activeX filetype
, а также как использовать атрибут ComEventInterface и его реализация будет хорошей.
[ComEventInterface (typeof (ITextBoxCheckEvents), typeof ( ITextBoxCheckEvents_EventProvider))]
также, если есть хорошая документация о том, как создать interop.MSComctlLib, как библиотека ActiveX, было бы хорошо.
проверил этот блог, но ни один из них не описывает, как обрабатывать события