返回首页

{A}介绍
更新 - 见下文限制3。
使用标准的DataGrid添加NET 4,我发现我需要执行复制和粘贴。搜寻网际网路来与解决方案要么工作与Silverlight或一些预发布版本的排序,你可以添加到Visual Studio 2008(3)。
我的恐惧,我不得不想办法,并编写一些代码。我很新的WPF,在过去的几个月,从互联网上复制示例代码我使用和修改,但我觉得我终于写的东西,可能是其他人的使用,所以这里是。
归功于以下两页,帮助,并采取一些代码是从第二个(评论计入):{A2的}{A3的}
该解决方案允许你做一些有限的细胞之间的复制和粘贴。在这个例子中,我有一个表领域的第一个名字的人,第二个名字,和腿(数字 - 通常为2)。在我工作的应用程序,它是没有意义的,从一列复制到另一个。因此,在这个例子中,你不能复制的腿列的第一个名字列(例如)。这是故意的限制,可以删去一些检查,很容易被删除。限制/问题解决!它只能处理字符串或整数。它应该是易于扩展,允许更多的代码,但也许可以完全避免了不同的实施类型。剪贴板只从一个特定的格式转换。我需要看到,如果从Excel作品的复制 - 否则,我可能需要把一些代码回DatagridHelper,我删除了!重要的,如果行重新排序,它打破了这个代码!出于这个原因,我建议你不要使用此代码。
雷托Ravisio看到这个{A4}和提供一个更好的解决方案。我已经采取了,稍微改变它,并提供完整的解决方案文件,使用自己的代码: {A5的}
希望这将有助于像我这样的初学者使用的代码。使用代码
我会去多一些的代码,你必须复制到您的项目,但你必须看到整个解决方案,以获得所需的所有代码。这是一个测试显示您的主要原则,所以你可以决定它是否适合你的。
DataGrid的声明如下:

<DataGrid Name="dataGrid1" ItemsSource="{Binding PeopleList}" 

                  SelectionUnit="Cell"

                  AutoGenerateColumns="True" 

                  KeyDown="dataGrid1_KeyDown" 

                  CopyingRowClipboardContent="dataGrid1_CopyingRowClipboardContent" 

                  ColumnReordered="dataGrid1_ColumnReordered"/>

注意,SelectionUnit设置到手机。这允许单个细胞,而不是整个行选择。该项目是取自一个ObserverableCollection列自动生成。
KeyDown事件设置检测粘贴操作:{C}
正如你可以看到,{A6的}。
视图模型粘贴的函数使用ClipboardHelper的类(在介绍中提到的MSDN博客)转换复制的单元格成一个字符串,它表示每一行的单元格数组列表的字符串版本。然后,它循环通过目标设置的ObservableCollection行。
使用反射来设置集合中的属性,只有一个字符串表示的属性的名称。这样就避免了一个switch语句检查显示指数值和匹配的属性。它会作出的代码非常繁琐的编写和可重复使用的不容易。
的setProperty函数实现该功能:
private void SetProperty(Person person, string propertyName, string cellItem)

{

  // Use reflection to set the property to the value

  Type type = person.GetType();

  PropertyInfo prop = type.GetProperty(propertyName);

  if (prop == null)

  {

    Debug.WriteLine("Property not found: " + propertyName);

    return;

  }

  if (prop.PropertyType == typeof(string)) // only caters for string or integer types

    prop.SetValue(person, cellItem, null);

  else

    prop.SetValue(person, int.Parse(cellItem), null);

  person.OnPropertyChanged(propertyName);

}

你可以看到在上面的代码上有唯一的字符串或整数的限制来自何处。
的一类人是一个简单的容器类实现INotifyPropertyChanged:{体C3}
代码填充地图的属性名称和显示索引(VM粘贴功能使用)依靠此位的代码,在代码隐藏:{的C4}
我假设,的SortMemberPath将始终是同一类人的财产名称。这是在我的情况。历史2011年9月1日:新的版本,当列重新排序,而不是加载时得到列信息。更新{A7的}基于一个可下载的完整的解决方案。| Peter_Smithson |雷托Ravasio:我想在座的解决方案,您是否是最好的方式做到这一点。
剪贴板数据,你完全为了在屏幕上layed。然后你复制而不列和行订购/能见度到模型中的数据。伊斯利,你可以看到它,当你走动的列。
另一个缺点是,你需要有你在网格的每个数据类型转换器的实现效果。 (见执行::错误**错误**),甚至强硬的绑定引擎已经知道如何从一个字符串转换为所需的类型(至少所有可写列)。

复制数据到网格模型,而不是一个可以防止各种问题。但后来我没有发现任何在互联网上,遵循这条路线,所以它也许只是不可能做到这一点

回答

评论会员:游客 时间:2012/02/04
雷托Ravasio:我有一展身手,在这种类型的实施,并张贴在结果{A8的}]我很高兴,如果你给它一个尝试,并告诉我如何为你的作品,尤其是你会做什么不同的。Excel和测试应用程序之间复制和粘贴显示,有很多事情可以做不同的,但我不想只写很少的代码thousend线......雷托
Peter_Smithson:感谢 - 我的意思是尝试一下前面,但我有与其他的东西。你可能救了我的工作有很多!我会尽力尽快
评论会员:游客 时间:2012/02/04
Peter_Smithson:我有一个快速播放的代码。它的工作比我尝试更好,但我做了一个调整,所以,如果你从一个细胞复制,并希望申请到几行,现在工作。例如,如果腿列数尚未填写,您现在可以将它设置为2,在第一行复制,值2,选择余下的腿细胞和按CTRL-V来填充整个列。{BR}正如你在你的文章中说-你提供了一个起点。我已经更新了我的企图处理列重新排序,但根据你的例子我会附上完整的解决方案,并建议在这条路线的身体我的文章-我可能已经删除了,你不是在你引用!也许我应该吗?P.S.-爱的LINQ功能的使用,以取代整个ClipboardHelper,我用
雷托Ravasio:我刚刚代码(没有足够的时间运行),并重新在快看!读你的文章。它变得有点乱,与不同的版本。我开始只是一个大约的第一次尝试短边音符。读者更感兴趣的是什么使你的文章/特殊项目又如何,你来。

我也将删除所有的代码示例项目(在文章的评论),这是不相关的DataGrid的复制/粘贴。代码运行的重要位所需的基础设施应保持在最低限度。 (例如,你并不需要一个观察的ViewModel,你不需要聪明的反射,基于错误**的东西,与一些汽车属性的简单类是不够的)

雷托

{C5的}
评论会员:游客 时间:2012/02/04
Peter_Smithson:TBH-我离开了,因为我无法弄清楚如何摆脱它在旧版本!它不停地说这是在文章中引用。觉得我现在摆脱它。我更新对您的代码,使其更简单的例子,但我想,我宁愿只是删除我的文章,因为它实际上没有任何价值。你想采取副本的例子,我把它放在你的文章呢?彼得:|雷托Ravasio:我下载的代码,并给它一个尝试。我想我明白你做的改变,但我觉得你的新代码工作propperly只有当你有数据在缓冲区从一个单一的科拉姆。只要你要复制超过1科拉姆,数据粘贴全面性的网格。不包括下载最新版本?因为你谈一个额外的循环,我不能找到?我真的不打算包括在我的文章下载的东西,因为它是因为代码是足够短,只是beeing粘贴到一个已经运行的应用程序。你也是正确的,你的文章,目前并没有增加任何价值,但我希望你来的东西,甚至Excel不能做。雷托:{BR​​}|Peter_Smithson
嗨 - 抱歉延误 - 有一个长周末去参加一个婚礼

循环一提的是一个错误 - 我有我的执行循环,但不为你添加。我提出的意见之前,我的代码!

我注意到的粘贴也不是很大,当选定的列匹配,但一开始只是对事物。

我已经问尝试xceed的DataGrid现在,所以我不得不停止寻找潜在的解决方案在此。我会回来的xceed人有更多的问题。
欢呼
评论会员:会员8535832 时间:2012/02/04
我期待在这同样的问题,但需要处理成千上万的数据行。通过网格粘贴,没有出现能够来处理这个问题,所以我修改的ObservableCollection彼得原来的例子。 4000行30列执行此方法看似即刻与每分钟200行粘贴到电网版本。
我看到的排序问题,但我们没有需要此数据录入格列排序或重新排序。
值得考虑,才决定有一个最好的方法