2012-09-13 42 views
3

添加ActiveX控件我想在用戶控件在C#窗口形式的基於項目添加一個ActiveX控件。如何在運行時

現在,如果我再補充一點,從然後在工具菜單中的ActiveX組件通過簡單地使用拖放我能夠使用ActiveX控件。
但是當我嘗試使用C#代碼則拋出以下異常添加一個在運行時:

「 類型的異常‘System.Windows.Forms.AxHost = InvalidActiveXStateException’被 拋出」。

使用CreateControl()我能夠擺脫這個異常,但現在的ActiveX控件不會出現在窗體上。

+0

您*必須*將該控件添加到父級的Controls集合中,爲其提供一個良好的家園。類似於'this.Controls.Add(foo);'其中foo是控件的實例。 –

+0

是的,我將它添加到標籤頁。啓動時,我能夠看到該標籤頁,但該控件未顯示在該標籤上。 – nvivekgoyal

回答

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,但你的想法...

+0

我試過這個,這讓我擺脫了不使用CreateControl()的異常。在此之後,仍然沒有出現在窗體上的ActiveX控件。 – nvivekgoyal

+0

謝謝,它正在處理表格。但我需要在.net用戶控件上使用它。 – nvivekgoyal

0

確定,一些更改後的代碼看起來如T他的。這裏在運行時創建了四個選項卡。最初,在第一個選項卡上顯示控件。當用戶點擊其他標籤頁時,動態地在這些頁面上添加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

+0

當在表單中直接使用相同的代碼時,它工作正常。但是,當這個代碼與.net用戶控件一起使用時,它顯示了上述行爲。 – nvivekgoyal

+0

你說:「在第一個選項卡上出現控件,但它確實出現在其他選項卡上」。這表明它出現在所有標籤上。 – BarrieK

+0

我的意思是,我可以在選項卡控件的第一個tabpage上看到activeX控件。但是當我點擊除第一個頁面之外的其他標籤頁時,這個ActiveX控件確實出現在它們上面。而在調試過程中,我可以將activeX控件看作每個tabpage的子控件。 – nvivekgoyal