4

C# Windows フォーム ベースのプロジェクトのユーザー コントロールに ActiveX コントロールを追加しようとしています。

ツール メニューからその activeX コンポーネントを追加すると、ドラッグ アンド ドロップを使用するだけで、activeX コントロールを使用できるようになります。
しかし、C# コードを使用して実行時に追加しようとすると、次の例外がスローされます。

「タイプ 'System.Windows.Forms.AxHost=InvalidActiveXStateException' の例外がスローされました」.

CreateControl() を使用すると、この例外を取り除くことができますが、activeX コントロールがフォームに表示されなくなりました。

4

2 に答える 2

2

コントロールをいつ追加し、フォームのどこに追加しますか?

通常、コンポーネントが初期化された直後にコンストラクターにコントロールをロードします。

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

関連するライセンス キーがある場合は、それらを設定し、フォームの適切なコンテナーに追加する必要があります。

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

    }

これは実際にはラップされた OCX 用ですが、アイデアはわかります...

于 2012-09-13T15:41:02.037 に答える
0

OK、いくつかの変更後、コードは次のようになります。ここでは、実行時に 4 つのタブが作成されます。最初に、最初のタブにコントロールが表示されます。ユーザーが他のタブ ページをクリックすると、これらのページに ActiveX コントロールが動的に追加されます。(このコードは .net ユーザー コントロール用に記述されています。実行時に、このユーザー コントロールがフォームに追加されます)

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

この実装の詳細については、次のページを参照してください: http://newapputil.blogspot.in/2013/11/how-to-add-activex-control-at-run-time.html

于 2012-09-14T03:12:59.377 に答える