[英]C# Cut/Copy & Paste objects
这是2份。
首先,我有一点时间让复制和粘贴操作的粘贴部分起作用。
我有一种将信息复制到剪贴板的方法,效果很好。
private void CopyData(string format, object data, string text)
{
bool addedData = false;
DataObject copyData = new DataObject();
if (!string.IsNullOrEmpty(text))
{
copyData.SetData(DataFormats.Text, text);
addedData = true;
}
if (!string.IsNullOrEmpty(format) && data != null)
{
copyData.SetData(format, false, data);
addedData = true;
//this is only for testing
object obj = null;
if (copyData.GetDataPresent(format))
obj = (object)copyData.GetData(format);
}
if (addedData)
Clipboard.SetDataObject(copyData, true);
}
当我检查是否已添加数据时,对象(obj)不为null。
但是,当我然后使用相同的格式键通过另一种方法粘贴数据时,每次都为null。
private void PasteFromClipboard()
{
object obj = null;
IDataObject paste = null;
if (Clipboard.GetDataObject().GetDataPresent("mydatatype"))
obj = (object)Clipboard.GetDataObject().GetData("mydatatype");
else
return;
if (obj == null)
throw new NullReferenceException("Could not gather information from the
}
我已经尝试了所有我能想到的东西,但这只是没有意义。 我创建了一个字符串数组来捕获DataObject持有的所有格式键,而“ mydatatype”是第一个。 我尝试使用(Clipboard.GetDataObject().GetData("mydatatype") as object)
强制转换,而不是强制转换,但我只是无法弄清楚。 我知道那里有数据,因为我可以转到记事本并粘贴与对象一起复制的文本。
关于为什么我能够以一种方法而不是另一种方法获取数据的想法?
其次,我想知道如何在两个窗口之间进行剪切和粘贴操作。 我正在考虑类似Excel的东西,如果仅粘贴文本,则数据将保留,但是如果粘贴对象,则将删除源。
谢谢帕特里克。
尝试以文本形式(而不是“ mydatatype”)提取数据-至少确认您可以从剪贴板中读取数据。 这很可能是记事本正在阅读的内容。 另外,使用“格式”进行复制但使用“ mydatatype”进行粘贴是否重要?
可能是text参数始终有一个值并被设置了。 如果设置对象的对象未执行,则可能是第二个对象。 或者,如果是这样,因为数据是在第一个if语句中设置的,那么第二组将无法正确设置它。
我的建议是在复制操作期间在调试器中遍历代码。
粘贴之前,请使用GetDataObject()。GetFormats()枚举格式代码列表。 也许您使用的是错误的..只是一个想法
尝试使用反射,如下所示:
private static T TryGetClipboardData<T>(IDataObject clipboardData, string dataFormat)
{
System.Reflection.FieldInfo fieldInfo = clipboardData.GetType().GetField("innerData", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
var outerData = fieldInfo.GetValue(clipboardData);
if (outerData == null)
{
return default(T);
}
fieldInfo = outerData.GetType().GetField("innerData", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
var innerData = fieldInfo.GetValue(outerData);
if (innerData is System.Runtime.InteropServices.ComTypes.IDataObject)
{
// It is (probably) necessary to wrap COM IDataObject to Windows.Forms.IDataObject
System.Windows.Forms.DataObject wrappedDataObject = new System.Windows.Forms.DataObject(innerData);
var data = wrappedDataObject.GetData(dataFormat);
if (data is T)
{
return (T)data;
}
}
return default(T);
}
我怀疑剪贴板中数据的COM对象很难将其自身转换为您指定的格式。 我还在使用输入格式字符串进行安全播放,以便将其注册为正确的剪贴板格式。
高温超导
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.