4
votes

I am trying to add an activeX control in an user control in a C# windows form based project.

Now if I add that activeX component from the tools menu then by simply using drag and drop I am able use the activeX control.
But when I try to add that one at run time using C# code then it throw following exception:

"Exception of Type 'System.Windows.Forms.AxHost=InvalidActiveXStateException' was thrown".

Using CreateControl() I am able to get rid of this exception but now the activeX control does not appear on the form.

2
You must add the control to the Controls collection of a parent to give it a good home. Something like this.Controls.Add(foo); where foo is the instance of the control. - Hans Passant
yes, I am adding it to a tab page. On launch, I am able to see that tab page but that control does not appear on that. - nvivekgoyal

2 Answers

2
votes

When are you adding the control and where are you adding it on the form?

You would normally load the control in the constructor just after the component is initialized:

    public FormRecalculation()
    {
        InitializeComponent();
        loadDataSelector();
    }

If there are any associated license keys you will need to set them and add them to the appropriate container on the form:

        private void loadDataSelector()
    {
        //Initialize the DataSelector
        DataSelector = new AXQDataSelector(getClsidFromProgId("QDataSelLib.QDataSel"));
        if (DataSelector != null)
        {
            System.Reflection.FieldInfo f =
                typeof(AxHost).GetField("licenseKey",
                System.Reflection.BindingFlags.NonPublic |
                System.Reflection.BindingFlags.Instance);
            f.SetValue(DataSelector, "license-here");

            splitContainer1.Panel2.Controls.Add(DataSelector);

            ((System.ComponentModel.ISupportInitialize)(DataSelector)).BeginInit();

            this.DataSelector.Dock = System.Windows.Forms.DockStyle.Fill;
            this.DataSelector.Enabled = true;
            this.DataSelector.Location = new System.Drawing.Point(0, 0);
            this.DataSelector.Name = "DataSelector";
            this.DataSelector.Size = new System.Drawing.Size(324, 773);
            this.DataSelector.TabIndex = 0;

            splitContainer1.Panel2.ResumeLayout();
            ((System.ComponentModel.ISupportInitialize)(DataSelector)).EndInit();

            this.ResumeLayout(false);
            this.PerformLayout();
        }
        else
        {
            return;
        }

    }

This is actually for a wrapped OCX but you get the idea...

0
votes

ok, after some changes the code looks like this. Here at runtime four tabs are created. Initially, on first tab the control is displayed. When user clicks on other tabs page activex control added on those pages dynamically. (This code is written for a .net usercontrol. On run time this usercontrol is added to the form)

   private void Populate()
    {
        int position;
        int i = 0;

        //here children in list of string type
        foreach (string child in children)
        {
            this.productLineTabs.TabPages.Add(child);
            AxSftTree treeadd = loadtree(this.productLineTabs.TabPages[i]);
            this.tree.Add(treeadd);

            this.tree[i].Columns = 2;
            this.tree[i].set_ColumnText(0, "Col1");
            this.tree[i].set_ColumnText(1, "Col2");

            position = this.tree[i].AddItem(child);
            i++;
        }

        form plv = new form();
        plv.Controls.Add(this);
        plv.Show();
    }

    private AxSftTree loadtree(TabPage tab)
    {
        AxSftTree treeobject = new AxSftTree();
        ((System.ComponentModel.ISupportInitialize)(treeobject)).BeginInit();
        SuspendLayout();
        tab.Controls.Add(treeobject);
        treeobject.Dock = DockStyle.Fill;
        ResumeLayout();
        ((System.ComponentModel.ISupportInitialize)(treeobject)).EndInit();

        return treeobject;
    }

You can find some details about this implementation on this page: http://newapputil.blogspot.in/2013/11/how-to-add-activex-control-at-run-time.html