Hello,
I need to design a full funcionaly ActiveX Data Grid.
I created an C# project:
The "tabele" is an:Code:using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Linq; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices; using System.Reflection; using Microsoft.Win32; namespace ActiveXGrid { [Guid("2DC138F0-1CB1-4F9A-ACC4-C3A1F708C495")] public interface ItabelenForm //: ITreeViewEvents_Event { void Add(params object[] values); void AddEmptyLine(); void AddEmptyColumn(); string Get(int row, int cell); } [Guid("A798EE8C-9EB0-40F9-A075-506FDBB149E8")] [TypeLibType(4224)] [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] public interface tabelenFormEvents { [DispId(1)] void Click(); } [ProgId("tabelenFormTEST")] [ClassInterface(ClassInterfaceType.None)] [ComSourceInterfaces(typeof(tabelenFormEvents))] public partial class tabelenForm : UserControl, ItabelenForm { public tabelenForm() { InitializeComponent(); base.Click += new EventHandler(CSActiveXCtrl_Click); } public void Add(params object[] values) { tabele.Rows.Add(values); } public void AddEmptyLine() { tabele.Rows.Add(); } public void AddEmptyColumn() { tabele.Columns.Add("testCol", "TCol"); } public string Get(int row, int cell) { return tabele.Rows[row].Cells[cell].Value.ToString(); } #region register /// <summary> /// Register the class as a control and set it's CodeBase entry /// </summary> /// <param name="key">The registry key of the control</param> [ComRegisterFunction()] public static void RegisterClass(string key) { // Strip off HKEY_CLASSES_ROOT\ from the passed key as I don't need it StringBuilder sb = new StringBuilder(key); sb.Replace(@"HKEY_CLASSES_ROOT\", ""); // Open the CLSID\{guid} key for write access RegistryKey k = Registry.ClassesRoot.OpenSubKey(sb.ToString(), true); // And create the 'Control' key - this allows it to show up in // the ActiveX control container RegistryKey ctrl = k.CreateSubKey("Control"); ctrl.Close(); // Next create the CodeBase entry - needed if not string named and GACced. RegistryKey inprocServer32 = k.OpenSubKey("InprocServer32", true); inprocServer32.SetValue("CodeBase", Assembly.GetExecutingAssembly().CodeBase); inprocServer32.Close(); // Finally close the main key k.Close(); } /// <summary> /// Called to unregister the control /// </summary> /// <param name="key">Tke registry key</param> [ComUnregisterFunction()] public static void UnregisterClass(string key) { StringBuilder sb = new StringBuilder(key); sb.Replace(@"HKEY_CLASSES_ROOT\", ""); // Open HKCR\CLSID\{guid} for write access RegistryKey k = Registry.ClassesRoot.OpenSubKey(sb.ToString(), true); // Delete the 'Control' key, but don't throw an exception if it does not exist k.DeleteSubKey("Control", false); // Next open up InprocServer32 RegistryKey inprocServer32 = k.OpenSubKey("InprocServer32", true); // And delete the CodeBase key, again not throwing if missing k.DeleteSubKey("CodeBase", false); // Finally close the main key k.Close(); } #endregion [ComVisible(false)] public delegate void ClickEventHandler(); public new event ClickEventHandler Click = null; void CSActiveXCtrl_Click(object sender, EventArgs e) { if (null != Click) Click(); // Raise the new Click event. } } }
The ActiveX Control is registering properly, etc.Code:private System.Windows.Forms.DataGridView tabele;
I created a new C# Windows Form project (container for the ActiveX control).
I puted the ActiveX control without problems on the form.
The interface for the methods is working properly, but I have a problem with getting the events:
I have declared it like this:Code:using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication3 { public partial class Form1 : Form { public Form1() { InitializeComponent(); tabelEvent.Click += new ActiveXGrid.tabelenForm.ClickEventHandler(onActivexClicked); } private void button1_Click(object sender, EventArgs e) { tabelenForm1.Add("test"); } private void button2_Click(object sender, EventArgs e) { tabelenForm1.AddEmptyColumn(); } private void button3_Click(object sender, EventArgs e) { tabelenForm1.AddEmptyLine(); } public void onActivexClicked() { button1.Text = "OK"; } } }
On the line:Code:private ActiveXGrid.tabelenFormEvents tabelEvent; private ActiveXGrid.tabelenForm tabelenForm1;
I getting an error:Code:tabelEvent.Click += new ActiveXGrid.tabelenForm.ClickEventHandler(onActivexClicked);
"Click" ist "Methodengruppe", daher ist die Zuordnung nicht möglich.
I have an German Visual and it means tha "Click" is a "Method group", so the assignment is not possible.
Please help me, I'm working on this control a whole week.
The control is based on the article:
http://code.msdn.microsoft.com/CSAct...f43e7d#content
Thank You very much good people![]()




Reply With Quote
