使用WPF C#.NET4.5使用Visual Studio 2012 ulti.
旧的winforms代码:
foreach (DataGridViewRow paretoRow in ParetoGrid.Rows)
{
if ((Convert.ToInt32(paretoRow.Cells["CurrentPareto"].Value) < (Convert.ToInt32(paretoRow.Cells["NewPareto"].Value))))
{
paretoRow.Cells["pNew"].Value = downArrow
}
}
字符串
正如您所看到的,我循环遍历的每一行都检查一个特定的单元格,如果为true,则填充另一个单元格。这是我以前用过很多次的很好的winforms代码。切换到WPF比我以前假设的要不同得多。DataGrid
不包含Row
属性。相反,我认为你需要用途:
DataGridRow paretoRow in paretogrid.Items
型
但我仍然不知道现在谁能拿到手机。
所以我的问题是,是否有语法更改要执行,如果有,在哪里?或者,我开始相信WPF中的数据网格比winforms更能与对象一起操作,因此不需要使用一个名为“行”的属性,如果是这种情况,我应该知道在这个例子中使用什么逻辑/语法?
谢谢你们的耐心,当我回家过银行假期的时候,我会做一些WPF的挖掘,看看它到底有多大的不同。
9条答案
按热度按时间8cdiaqws1#
人们似乎把这件事复杂化了,这对我很有效:
字符串
2uluyalo2#
我认为首先要做的是获取
DataGrid
的所有行:字符串
然后遍历网格:
型
gmxoilav3#
是的,你是对的。WPF
DataGrid
是围绕更好地支持对象的使用而构建的。您可以使用类似于以下内容的ViewModel。将它们全部构建到一个集合中,然后将该集合设置为您的
ItemsSource
。如果您想显示和图像,而不是pNew为true/false的复选标记,则还需要使用ValueConverter。字符串
编辑
为了简化它,您可以使用基本ViewModel类并使用
PropertyChanged
织入。代码将简化为:型
bakd9h0s4#
我甚至不明白为什么在数据网格中获取行和它们的值会如此复杂。我感觉像地狱找到如何。API甚至给予了有趣的有趣的事件名称,这也不是那么直接。为什么人们不能只关注基线,给予真正需要的东西,而不是各种各样的没有用处和意义的不同选择。我的意思是吃东西只需要一个勺子和叉子就可以了。从十万年前就没变过。这是我的代码,感谢那个提到有些人只是试图把事情复杂化,浪费你的时间的人。
字符串
sz81bmfz5#
查尔斯的“最简单”的回答为我做了。但是我使用了
Items
而不是ItemsSource
。现在,对于得到此错误的人:
字符串
对我来说,禁用DataGrid的属性
CanUserAddRows
是一件好事。这将删除新行的占位符行,从而删除占位符对象(它不是DataRowView,而是其他对象)。如果你已经禁用了这个,那我就不知道了。因为我想循环遍历每行的每个元素,所以我添加了另一个
foreach
:型
ix0qys7i6#
在WPF中,您可以更加动态和面向对象地进行操作。您可以在
DataGrid
中放置的元素的属性上绑定“pNew”列,这将返回downarrow。如果该值发生更改,则可以引发事件PropertyChanged
(接口INotifyPropertyChanged
),并且将重新计算绑定属性。对于以WPF开头的应用程序来说,同样有趣的是
DataTemplate
、ControlTemplate
、Converter
。转换器将属性值更改为WPF可用的值(例如,BoolToVisibility)。DataTemplate
和ControlTemplate
可用于更改控件的外观。有几个很好的教程为WPF在那里。我还建议您研究MVVM模式,将其用作Businessobject和WPF-Control的中间层,尤其是在处理类似于此处尝试执行的操作时。
h5qlskok7#
如果使用类的示例(如struct_class)填充datagridview行,这将是拥有foreach循环的最快方式
字符串
vybvopom8#
如果您的DataGrid绑定到自定义对象集合(例如
List<MyViewItem>
),DataGridRow迭代显然不起作用。仅当使用DataTable/DataGridView作为DataGrid ItemsSource时。可以迭代自定义DataGrid集合,但只有视图中的行具有已计算的绑定。
为了解决这个问题,我使用了BindingPropertyHelper解决方案作为Fallback:
字符串
以下代码将所有DataGrid行转换为新的(可迭代的)DataTable:
型
polhcujo9#
为什么不能只使用这个属性来获取行数,然后使用For循环进行迭代呢?
字符串