【问题标题】:How to put datagrid into an array如何将数据网格放入数组
【发布时间】:2017-06-26 03:43:38
【问题描述】:

我有一个datagrid,我想将特定列放入一个数组中,我想怎么做?我的 xml 看起来像:

<Datagrid x:Name="dgSample" ItemsSource="{Binding ProductsView}"
   <Datagrid.Columns>
      <DatagridTextColumn Header="Name" Binding="{Binding ProductName, Mode=TwoWay}" />
      <DatagridTextColumn Header="Value" Binding="{Binding ProductValue, Mode=TwoWay}" />
      ...

数组的定义是:

public static ushort[] temp = new ushort[20];

如何将列 Value 放入Datagrid dgSample 到Array temp 中?提前致谢!

--------------------------更新--------- ----------------------------------------

    private ICollectionView _ProductsView;
    public ICollectionView ProductsView
    {
        get { return _ProductsView; }
        set
        {
            _ProductsView = value;
            NotifyPropertyChanged();
        }
    }

    private void UpdateProducts()
    {
        _ds = sdb.GetProducts();
        ProductsView = new ListCollectionView(_ds.Tables["Products"].DefaultView)
        {
            Filter = obj =>
            {
                var Product= obj as DataRowView;
                return SelectedProduct != null && SelectedProduct.ModelName == Product["ProductName"].ToString();
            }
        };
    }


    public DataSet GetProducts()
    {
        DataSet ds = StoreDbDataSet.ReadDataSet();

        ObservableCollection<Product> products = new ObservableCollection<Product>();
        foreach (DataRow productRow in ds.Tables["Products"].Rows)
        {
            products.Add(new Product((string)productRow["ProductName"],
                (UInt16)productRow["ProductValue"]));
        }
        return StoreDbDataSet.ReadDataSet();
    }

namespace ProductDatabase
{
    public class Product : INotifyPropertyChanged
    {
        ...
     }
}

【问题讨论】:

  • 你是什么意思将列...放入数组临时? DataGridColumn 不是 ushort,这是您的数组类型。
  • 你可以试试var values = myDataGrid.Columns.Where(c =&gt; c.Header.ToString() == "Name").Select(c =&gt; Convert.ToUInt16(c.GetValue(TextBlock.TextProperty))).ToArray();。虽然它未经测试,但它使用标题名称获取列,如果这是必需的列,则将“名称”替换为“值”。假设列中的所有值都可以转换为ushort,但我建议检查空值或不可转换值。
  • @KeyurPATEL 您的解决方案绝对错误。您正在尝试获取DataGridColumn 的TextBlock.Text 属性。如果列 Name 是 DataGrid 中唯一具有此名称的列,您将获得单个值。而且这个值不是表中某行的值。
  • @KeyurPATEL 您的建议运行时出现错误:The name 'value' does not exist in the current context
  • 是的,正如@Maxim 提到的,我的建议是完全错误的。由于我目前正在使用数据网格,因此我很快就会为您提供真正的答案。

标签: c# arrays wpf datagrid


【解决方案1】:

假设您是在代码隐藏中而不是在 ViewModel 中执行此操作,您可以使用这段代码来获取数组:

假设datagrid中每一项的数据类型为“Product”

for (int i = 0; i < dgSample.Items.Count; i++)
{
    var row = dgSample.Items[i] as Product;
    if (row != null)
        temp[i] = Convert.ToUInt16(row.ProductValue);    //or if it is a ushort already, no need to Convert
}

或者,如果您使用 MVVM 结构并有一个 ViewModel,因为您的项目源代码是 ItemsSource="{Binding Product, Mode=TwoWay}"(您是说产品吗?):

编辑:

由于您使用的是ICollectionView,因此您可以使用foreach 直接循环遍历元素,或者简单地将其Cast 转换为您的数据类型并转换为列表或数组,如下所示

temp = ProductsView.Cast<Product>().Select(p => Convert.ToUInt16(p.ProductValue)).ToArray();

如果您的变量名为 ProductID 或其他名称,请将 ProductValue 替换为该名称。

正如 Maxim 所建议的,您的 itemssource 绑定不需要通过 TwoWay,而是让您的行拥有它是有意义的(如果您允许用户编辑它们):

<Datagrid x:Name="dgSample" ItemsSource="{Binding Product}"
    <Datagrid.Columns>
        <DatagridTextColumn Header="Name" Binding="{Binding ProductName, Mode=TwoWay}" />
        <DatagridTextColumn Header="Value" Binding="{Binding ProductValue, Mode=TwoWay}" />
         ...

【讨论】:

  • 第二个代码 sn -p 是应该使用的解决方案。还要注意@barry:在使用它们之前阅读绑定属性。 Mode=TwoWay 对 ItemsSource 没有意义。很遗憾,几乎每天我都会看到关于这些东西的新问题。
  • 感谢您的帮助,但我的ProductsView 被声明为ICollectionView,其中不包含Select 方法。
  • @barry 嗨,你能告诉我什么 ObservableCollection/List 是那个 ICollectionView 的来源吗?或者您可以更新您的问题以添加 ProductsView 的声明以及绑定到它的 List。
  • @barry ICollectionView 是 IEnumerable,因此您可以在其上使用 OfType&lt;Product&gt; 或在集合视图的 SourceCollection 上使用。请学习 C# 并使用 MSDN 来检查类型。
  • @KeyurPATEL 我是 C# 新手,很抱歉一直问你,但似乎 unable to cast object type 'System.Data.DataRowView' to type 'ProductDatabase.Module'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
  • 2012-10-12
  • 1970-01-01
  • 1970-01-01
  • 2019-09-09
相关资源
最近更新 更多