From the attached code.With AllowDrop = True I get a .NET error as follows:

System.InvalidOperationException: DragDrop registration failed. ---> System.Threading.ThreadStateException: The current thread must set to Single Thread Apartment (STA) mode before OLE calls can be made. Ensure that your Main function has STAThreadAttribute marked on it.

From googling I need to set ApartmentState.STA. But this is readonly. How do I set STA correctly in Python for .NET?

Any thoughts appeciated.

Guy

from CLR import System
import CLR.System.Windows.Forms as WinForms
from CLR.System.Drawing import Color, Size, Point

from CLR.System import ComponentModel,Data, Collections, Threading
from CLR.System.Runtime import InteropServices

class dataNode(WinForms.TreeNode):
    
    def __init__(self,name,total,skill):   
        self.Text = name
        self.Total = total
        self.Skill = skill

class DnDTree(WinForms.Form):
    """A WinForms example.
    """

    def __init__(self):
        self.components = System.ComponentModel.Container()
        self.treeView1 = WinForms.TreeView()
        self.listBox1 = WinForms.ListBox()
        self.SuspendLayout()

        # Set properties of TreeView 1.
        self.treeView1.AllowDrop = True
        self.treeView1.ImageIndex = -1
        self.treeView1.Location = System.Drawing.Point(24, 32)
        self.treeView1.CheckBoxes = True
        self.treeView1.Name = "treeView1"
        self.treeView1.Nodes.Clear()
        self.treeView1.BeginUpdate()
        for pnode in range(50):
            self.treeView1.Nodes.Add(dataNode("node%d"%pnode,3,"high"))
            for cnode in range(15):
                self.treeView1.Nodes[pnode].Nodes.Add("childnode%d"%cnode)
        self.treeView1.EndUpdate()
        #for node in self.treeView1.Nodes:
            #print node.Total
        self.treeView1.SelectedImageIndex = -1
        self.treeView1.Size = System.Drawing.Size(300, 600)
        self.treeView1.TabIndex = 0
        #self.treeView1.MouseDown += 
System.Windows.Forms.MouseEventHandler(self.treeView1_MouseDown)
        #self.treeView1.AfterSelect += 
System.Windows.Forms.TreeViewEventHandler(self.treeView1_AfterSelect)
        #self.treeView1.QueryContinueDrag += 
System.Windows.Forms.QueryContinueDragEventHandler(self.treeView1_QueryContinueDrag)
        #self.treeView1.DragEnter += 
System.Windows.Forms.DragEventHandler(self.treeView1_DragEnter)
        #self.treeView1.ItemDrag += 
System.Windows.Forms.ItemDragEventHandler(self.treeView1_ItemDrag)

        # Set properties of ListBox 1.
        self.listBox1.AllowDrop = True
        self.listBox1.Location = System.Drawing.Point(24, 650)
        self.listBox1.Name = "listBox1"
        self.listBox1.Size = System.Drawing.Size(300, 300)
        self.listBox1.TabIndex = 1
        #self.listBox1.DragDrop += 
System.Windows.Forms.DragEventHandler(self.listBox1_DragDrop)
        #self.listBox1.DragEnter += 
System.Windows.Forms.DragEventHandler(self.listBox1_DragEnter)

        #Now do Form
        self.AutoScaleBaseSize = System.Drawing.Size(5,13)
        self.ClientSize = System.Drawing.Size(400,1024)
        self.Controls.Add(self.listBox1)
        self.Controls.Add(self.treeView1)
        self.ShowInTaskbar = False
        self.StartPosition = WinForms.FormStartPosition.CenterScreen
        self.Name = "Form1"
        self.Text = "Form1"
        self.ResumeLayout(False)

    def Dispose(self):
        self.components.Dispose()
        WinForms.Form.Dispose(self)

def main():
    app = DnDTree()
    WinForms.Application.Run(app)
    app.Dispose()

if __name__ == '__main__':
    main()
_________________________________________________
Python.NET mailing list - [email protected]
http://mail.python.org/mailman/listinfo/pythondotnet

Reply via email to