如何将datagrid放入数组中

时间:2017-06-26 03:43:38

标签: c# arrays wpf datagrid

我有一个datagrid我希望将特定列放入数组中,我想如何做到这一点?我的xaml看起来像:

<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中的 dgSample放入数组 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
    {
        ...
     }
}

1 个答案:

答案 0 :(得分:1)

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

假设数据网格中每个项目的数据类型为&#34;产品&#34;

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}" />
         ...