我正在使用C#和Winforms 3.5
我有一个用户控件列表,所有用户控件都派生自一个基类。这些控件可以添加到各种面板中,我正在尝试实现拖放功能,我正在运行的问题是在DragDrop事件上。
对于DragEventArgs e.Data.GetData(typeof(baseClass))
不起作用。它想要:
e.Data.GetData(typeof(derivedClass1))
e.Data.GetData(typeof(derivedClass2))
etc...
有没有办法解决这个问题,或者更好的方法来构建它?
答案 0 :(得分:17)
您可以将数据包装在公共类中。例如,假设您的基类名为DragDropBaseControl
public class DragDropInfo
{
public DragDropBaseControl Control { get; private set; }
public DragDropInfo(DragDropBaseControl control)
{
this.Control = control;
}
}
然后可以使用基类
中的以下内容启动拖放DoDragDrop(new DragDropInfo(this), DragDropEffects.All);
您可以使用以下
访问拖动事件中的数据e.Data.GetData(typeof(DragDropInfo));
我是否正确理解了您的要求?
答案 1 :(得分:0)
要动态获取拖动对象,甚至不知道其类型或基类型,我在DragDrop
事件中使用此代码:
baseClass myObject = (baseClass)e.Data.GetData(e.Data.GetFormats()[0]);
因为e.Data.GetFormats()[0]
将始终保持拖动对象类型的字符串表示形式。
请注意,我假设拖动了一个对象,但多个拖动对象的想法是相同的。
答案 2 :(得分:0)
要详细说明Abdulhameed Shalabi的答案,请确保该对象属于预期的类型;否则,尝试投射将引发异常。
一种方法是简单的try-catch,如果尝试失败,则忽略拖放。
public static int computeProduct(int first , int second)
{
int max = 40;
int min = 10;
if (min <= first) {
if (first <= max) {
if (min <= second) {
if (second <= max) {
return first*second;
}
}
}
}
System.out.println("Number is not in range, please try again");
return 0;
}