C # DoDragDrop для несериализуемого объекта - PullRequest
2 голосов
/ 11 марта 2011

У меня есть UserControl, который можно перетаскивать по моей форме. Я получаю исключение первого случая, когда элемент управления случайно перетаскивается из моей формы на рабочий стол (например):

A first chance exception of type 'System.Runtime.InteropServices.COMException' occurred in System.Windows.Forms.dll

Additional information: Invalid FORMATETC structure (Exception from HRESULT: 0x80040064 (DV_E_FORMATETC))

Когда я запускаю процесс перетаскивания, я передаю объект типа Control. Это не Сериализуемый, и при этом я не хочу, чтобы это было. Есть ли способ, которым я могу обойти это или есть обработка для перетаскивания объекта за пределы формы хоста?

CallStack:

>   System.Windows.Forms.dll!System.Windows.Forms.DataObject.GetDataIntoOleStructs(ref System.Runtime.InteropServices.ComTypes.FORMATETC formatetc, ref System.Runtime.InteropServices.ComTypes.STGMEDIUM medium) + 0x175 bytes 
    System.Windows.Forms.dll!System.Windows.Forms.DataObject.System.Runtime.InteropServices.ComTypes.IDataObject.GetDataHere(ref System.Runtime.InteropServices.ComTypes.FORMATETC formatetc, ref System.Runtime.InteropServices.ComTypes.STGMEDIUM medium) + 0x70 bytes    
    System.Windows.Forms.dll!System.Windows.Forms.DataObject.System.Runtime.InteropServices.ComTypes.IDataObject.GetData(ref System.Runtime.InteropServices.ComTypes.FORMATETC formatetc, out System.Runtime.InteropServices.ComTypes.STGMEDIUM medium) + 0x152 bytes   
    [Native to Managed Transition]  

Вот еще один стек, но VS2010 завис, поэтому я не смог скопировать и вставить его. Screenshot

1 Ответ

5 голосов
/ 11 марта 2011

Мне не ясно, как сработало это исключение, рабочий стол не должен использоваться для вашего контроля.Курсор мыши должен показывать форму «здесь нельзя».Тем не менее, исключения первого шанса во время D + D не имеют смысла, они проглатываются и никак не влияют на работу.Вы видите их только потому, что к вам подключен отладчик.

Если вы действительно хотите углубиться в это, то используйте «Отладка + Исключения», установите флажок «Брошено» для исключений Common Language Runtime.Отладчик остановится, когда возникнет исключение.Вполне вероятно, что он возникает в сантехническом коде Winforms, у вас не будет исходного кода, если вы не включите Reference Source.Опубликуйте трассировку стека в своем вопросе, если не можете разобраться.Обязательно скопируйте все, прокрутите его, если необходимо, чтобы получить верхнюю рамку активации.

Но повторяя, это не должно быть проблемой на практике.Пользователь должен увидеть курсор мыши «не могу сбросить», исключение проглатывается без завершения вашей программы.

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