Как перетащить элемент из формы C # и перетащить в другое приложение? - PullRequest
3 голосов
/ 17 сентября 2009

Я хочу знать, как мы можем перетащить элемент из дерева в C # и вставить в другое (autocad) приложение. Этот элемент в основном является файлом autocad .dwg.

Я написал код:

private void treeView1_ItemDrag(object sender, ItemDragEventArgs e)
{     

     TreeNode n = (TreeNode)e.Item;
     this.treeView1.DoDragDrop(AcadObj, DragDropEffects.Copy);

}

AcadObj является объектом autocad.

Это событие работает нормально, но событие DragDrop не запускается, даже когда я перетаскиваю автокад, указатель мыши дает мне знак плюс (что файл здесь принят) Мое событие DragDrop:

private void treeview1_DragDrop(object sender, DragEventArgs e){

       MessageBox.Show("It works");
}

Вышеуказанное событие не работает и не показывает мне MessageBox. Я реализовал только эти два события.

Пожалуйста, помогите мне и направьте меня, как я могу это сделать

Ответы [ 3 ]

3 голосов
/ 13 ноября 2009

На самом деле, ОП не передал все детали. Во-первых, он, скорее всего, уже работает в том же пространстве памяти, поскольку 99% всего программирования, связанного с AutoCAD, выполняется в процессе. Во-вторых, какая версия AutoCAD и какая версия .NET? Не зная этих двух ключевых данных, любой ответ может быть неправильным.

Сказав это, событие DragDrop в элементе управления древовидной структуры никогда не сработает, если вы перейдете в AutoCAD - это событие для отбрасывания в древовидной структуре! При работе с AutoCAD вызов DoDrop из древовидной структуры также не лучший вариант. Что вы должны сделать, это вызвать событие DoDragDrop приложения AutoCAD:

AcApp.DoDragDrop (источник, данные, DragDropEffects.All, новый DropTargetNotifier ())

DropTargetNotifier обрабатывает отброшенные данные и будет в том месте, где вы разместите свой ящик сообщений.

3 голосов
/ 29 сентября 2009

Проблема из-за нехватки памяти. Видите ли, .NET хранит свою память внутри CLR. Это означает, что вы не можете перетаскивать что-либо из .NET в другое приложение, работающее в другом пространстве памяти, используя .NET dragdrop.

Вы должны использовать межпроцессное перетаскивание.

WINOLEAPI DoDragDrop( 
  IDataObject * pDataObject,  //Pointer to the data object
  IDropSource * pDropSource,  //Pointer to the source
  DWORD dwOKEffect,           //Effects allowed by the source
  DWORD * pdwEffect           //Pointer to effects on the source
);

Если вы оберните объект, который вы хотите перетащить, в собственную реализацию IDataObject, вы можете перетащить каплю в любое приложение.

Я бы опубликовал пример, но я не могу найти один в моем источнике, который достаточно "чист", чтобы опубликовать в качестве примера. Гугл вокруг. Ищите реализации перетаскивания, используя C ++ COM. Используйте это вместо встроенного перетаскивания .NET.

0 голосов
/ 01 июля 2012

Чтобы ваш элемент управления TreeView мог перетаскивать в область рисования AutoCAD, вам нужно разместить / встроить свой элемент управления в PaletteSet в AutoCAD: Вот мой пример (я использую ListBox здесь, т.е.

public dragdropentity TestLB; //dragdropentity is my actuall control containing my ListBox

        [CommandMethod("ListBox")]
        public void lb()
        {
            if (this.TestLB == null)
            {
                myPaletteSet = new PaletteSet("Test ListBox", new Guid("{B32639EE-05DF-4C48-ABC4-553769C67995}"));
                TestLB = new dragdropentity();
                myPaletteSet.Add("LB", TestLB);

            }
            myPaletteSet.Visible = true;
        }

Как только вы сможете отобразить TreeView в PaletteSet, вы можете вызвать метод DragDrop приложения AutoCAD. Вот сегмент кода из класса dragdropentity:

public partial class dragdropentity : UserControl
    {
        public dragdropentity()
        {
            InitializeComponent();
        }

        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            //            MessageBox.Show(listBox1.SelectedIndex.ToString() + '\n' + listBox1.SelectedItem.ToString());
            pictureBox1.Load(@"D:\My\Documents\Visual Studio 2010\Projects\ClassLibrary1\ClassLibrary1\Images\" + listBox1.SelectedItem.ToString() + ".png");
        }
        void listBox1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            int indexOfItem = listBox1.IndexFromPoint(e.X, e.Y);
            if (indexOfItem >= 0 && indexOfItem < listBox1.Items.Count)  // check that an string is selected
            {
                listBox1.DoDragDrop(listBox1.Items[indexOfItem], DragDropEffects.Copy);

            }

            //           throw new System.NotImplementedException();
        }


        void listBox1_QueryContinueDrag(object sender, System.Windows.Forms.QueryContinueDragEventArgs e)
        {
            ListBox lb = (ListBox)sender;
            textBox1.AppendText('\n' + e.Action.ToString() + '\n'+ this.Name.ToString());

            if (e.Action == DragAction.Drop)
            {
                Autodesk.AutoCAD.ApplicationServices.Application.DoDragDrop(this, "Drag & drop successful!!!", System.Windows.Forms.DragDropEffects.All, new DragDrop());
            }
        }
}

DragDrop () - ваш собственный класс, обрабатывающий событие Drop. Вот мой код:

 class DragDrop : DropTarget
    {

        public override void OnDrop(System.Windows.Forms.DragEventArgs e)
        {
            using (DocumentLock docLock = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.LockDocument())
            {
        //        MyCommands mc = new MyCommands();
          //      mc.CircleJig();

                //Call your own methods etc here.

             }

        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...