【问题标题】:WPF: Adding to a datagrid from various ListsWPF:从各种列表添加到数据网格
【发布时间】:2013-03-28 15:44:04
【问题描述】:

我有各种值列表,我通过数据记录应用程序的文本文件读取这些值。我的最终目标是拥有一个数据网格,其中每个值都有一列。这是我正在尝试做的基本概述......

1.) 读入一个文本文件并创建一个新的 dataFile 类 - 该类解析文本文件中的各个列并为每个变量创建浮点列表。

2.) dataFile 类包含返回每个列表的方法

3.) 我想将这些列表添加到我的数据网格中,但我无法找到有关如何执行此操作的信息。

示例:我可以使用以下代码行填充一列...

dataGrid1.ItemsSource = runOne.getRPM();

其中 runOne 是一个 fataFile,getRPM() 返回一个浮点数列表。

当我尝试使用多个列表执行此操作时,例如

 dataGrid1.ItemsSource = runOne.getRPM();
 dataGrid1.ItemsSource = runOne.getPower();

只有 dataGrid 的第一列被填充。我已经为 dataGrid 创建了列,下面是 XAML 代码...

<DataGrid AutoGenerateColumns="False" Height="305" HorizontalAlignment="Left"   Margin="153,12,0,0" Name="dataGrid1" VerticalAlignment="Top" Width="454">
        <DataGrid.Columns>
            <DataGridTextColumn Header="RPM" />
            <DataGridTextColumn Header="Flywheel Torque" />
            <DataGridTextColumn Header="TorqM" />
            <DataGridTextColumn Header="TorqS" />
            <DataGridTextColumn Header="Power (HP)" />
            <DataGridTextColumn Header="Flywheel Power" />
            <DataGridTextColumn Header="Temp" />
        </DataGrid.Columns>
    </DataGrid>

有没有一种方法可以根据单个列表中的项目填充每一列?我写了一个方法来返回所有列表(列表列表),我试图让它工作,但它没有。

非常感谢任何建议/想法。

【问题讨论】:

    标签: c# .net wpf datagrid wpfdatagrid


    【解决方案1】:

    尝试使用新类创建和填充可观察集合,其中您将拥有 RPM 和 Power (ObservableCollection&lt;RpmPower&gt;) 的两个属性。之后,您可以将网格绑定到新集合。

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    
    namespace Test
    {
        public class RpmPowerModel : INotifyPropertyChanged
        {
            #region Properties
    
            public int Rpm
            {
                get { return _rpm; }
                set
                {
                    if (_rpm != value)
                    {
                        _rpm = value;
                        RaisePropertyChanged("Rpm");
                    }
                }
            }
    
            private int _rpm;
    
            public int Power
            {
                get { return _power; }
                set
                {
                    if (_power != value)
                    {
                        _power = value;
                        RaisePropertyChanged("Power");
                    }
                }
            }
    
            private int _power;
    
            #endregion
    
            #region Implementation of INotifyPropertyChanged
    
            public event PropertyChangedEventHandler PropertyChanged;
    
            protected void RaisePropertyChanged(string propertyName)
            {
                PropertyChangedEventHandler handler = PropertyChanged;
                if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
            }
    
            #endregion
    
            public static List<RpmPowerModel> LoadItems(List<int> rpms, List<int> powers)
            {
                if (rpms == null)
                {
                    throw new ArgumentNullException("rpms");
                }
    
                if (powers == null)
                {
                    throw new ArgumentNullException("powers");
                }
    
                var result = new List<RpmPowerModel>(Math.Max(rpms.Count, powers.Count));
    
                for (int i = 0; i < Math.Max(rpms.Count, powers.Count); i++)
                {
                    var model = new RpmPowerModel
                    {
                        Rpm = i < rpms.Count ? rpms[i] : 0,
                        Power = i < powers.Count ? powers[i] : 0
                    };
    
                    result.Add(model);
                }
    
                return result;
            }
        }
    }
    

    【讨论】:

    • 除了使用可观察的集合之外,还有什么方法可以完成这项工作?我不知道如何使用它们
    • 是的,您可以创建和使用 List 而不是 ObservableCollection... 其中 RpmPower 是具有 RPM 和 Power 属性的类。
    • 但是我已经有一个具有这些属性的类,该类可以返回我想在数据网格上显示的各种列表,如果我误解了某些东西,我深表歉意,例如 runOne.getRPM()返回 RPM 值的 List 而 runOne.getPower() 返回功率值的列表
    • 你在这里丢失了 RPM:dataGrid1.ItemsSource = runOne.getRPM(); dataGrid1.ItemsSource = runOne.getPower();所以看起来你应该有一个具有 RMP 和 Power 属性的类,让它命名为 RpmPower。然后创建并填充 List。然后 dataGrid1.ItemsSource = listRpmPower.
    • 我添加了代码示例。因此,您将拥有一个包含这两个属性的列表。
    猜你喜欢
    • 2016-07-11
    • 2016-04-21
    • 1970-01-01
    • 2014-05-09
    • 2013-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-13
    相关资源
    最近更新 更多