将列表数组添加到datagrid列中

时间:2017-03-03 16:47:20

标签: c# wpf list xaml datagrid

我制作的代码很少列表。最后,我得到以下列表:

List<int> list_AmountNeed = new List<int>();
List<int> list_TotalCost = new List<int>();
List<int> list_TotalLose = new List<int>();
List<int> list_TotalGain = new List<int>();

经过一些计算后,这些列表包含值(如果重要的话,每个值为24个):

    while (z < list_Exp.Count)
    {

        list_AmountNeed.Add((goalexp - currentexp) / Convert.ToInt32(list_Exp[z]));
        list_TotalLose.Add(list_AmountNeed[z] * (list_Amount_MadeFrom_One[z] * list_BuyPrice_MadeFrom_One[z] + list_Amount_MadeFrom_Two[z] * list_BuyPrice_MadeFrom_Two[z]));
        list_TotalGain.Add(list_AmountNeed[z] * list_AmountMade[z] * list_SellPrice[z]);
        list_TotalCost.Add(list_TotalGain[z] - list_TotalLose[z]);

        z++;

    }

现在,我已经创建了一个包含按钮的UI和使用混合的Datagrid,我希望在单击按钮后,这些列表将显示在Datagrid列中。

我到目前为止所做的是将此代码插入按钮xaml.cs. 我不知道怎么办的事情是,如果我可以在按钮xaml.cs中编写显示代码,或者它必须在datagrid中,并且输入正确的代码以在列中显示它:

column 1:
list_AmountNeed

column 2:
list_TotalCost

等等。

谢谢!

2 个答案:

答案 0 :(得分:2)

存储相关数据的4个列表是一个糟糕的数据结构(绝对不是OOP)。例如。要添加1个数据({金额,成本,损失,增益}),必须执行4个添加操作。

同样,DataGrid按行显示数据,因此不能只在不同列中显示独立列表。

DataTable(@ rory.ap建议)是一个出色的通用类,可以和DataGrid一起使用,但我想说它对于当前的要求来说太过分了。

让我们创建一个包含4个属性的POCO以及具有实际值的对象列表,并将它们显示在DataGrid中。

public class MyDataObject
{
    public int Amount { get; set; }
    public int Cost { get; set; }
    public int Lose { get; set; }
    public int Gain { get; set; }
}

窗口内容xaml

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition />
    </Grid.RowDefinitions>

    <Button Content="+" Click="DisplayClick"/>

    <DataGrid Name="Dg" Grid.Row="1"/>
</Grid>

窗口代码隐藏

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private List<MyDataObject> L = new List<MyDataObject>
    {
        new MyDataObject {Amount = 1, Cost = 1, Gain = 1},
        new MyDataObject {Amount = 2, Cost = 2, Gain = 4},
        new MyDataObject {Amount = 3, Cost = 3, Gain = 9},
    };

    private void DisplayClick(object sender, RoutedEventArgs e)
    {
        Dg.ItemsSource = L;
    }
}

分配ItemsSource时,DataGrid会为每个属性生成一列(属性名称显示在标题中),并在列和属性之间创建绑定

结果:

datagrid with values

如果需要,使用其他属性扩展MyDataObject,例如

public class MyDataObject
{
    public int SellPrice {get; set; }

    public int Amount { get; set; }
    public int Cost { get; set; }
    public int Lose { get; set; }
    public int Gain { get; set; }
}

可以修改计算方法以使用MyDataObject对象

var L = new List<MyDataObject>();
for(int z = 0; z < list_Exp.Count; z++)
{
    var d = new MyDataObject();
    d.Amount = (goalexp - currentexp) / Convert.ToInt32(list_Exp[z]);
    d.Lose = d.Amount * (list_Amount_MadeFrom_One[z] * list_BuyPrice_MadeFrom_One[z] + list_Amount_MadeFrom_Two[z] * list_BuyPrice_MadeFrom_Two[z]);
    // d.SellPrice = list_SellPrice[z];
    d.Gain = d.Amount * list_AmountMade[z] * list_SellPrice[z];
    d.Cost = d.Gain - d.Lose;

    L.Add(d);
}

答案 1 :(得分:0)

与ASh非常相似,使用相同的原则。我的数据网格在Winform中,但您可以在XAML数据网格上执行相同的操作。

using System.Collections.Generic;
using System.Windows.Forms;

namespace PopulatingDataGridColumns_42584334
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            List<int> list_AmountNeed = new List<int>() { 3, 6, 7, 8, 9, 12 };
            List<int> list_TotalCost = new List<int>() { 4, 3, 6, 9, 65, 87 };
            List<int> list_TotalLose = new List<int>() { 7, 9, 2, 5, 15, 27 };
            List<int> list_TotalGain = new List<int>() { 3, 1, 2, 2, 0, 4 };

            List<gridviewdata> mydatalist = new List<gridviewdata>();
            for (int i = 0; i < list_AmountNeed.Count; i++)
            {
                mydatalist.Add(new gridviewdata
                {
                    col1 = list_AmountNeed[i].ToString(),
                    col2 = list_TotalCost[i].ToString(),
                    col3 = list_TotalLose[i].ToString(),
                    col4 = list_TotalGain[i].ToString()
                });
            }
            dataGridView1.DataSource = mydatalist;//assuming the datagridview is named dataGridView1
        }
    }


    class gridviewdata
    {
        public string col1 { get; set; }
        public string col2 { get; set; }
        public string col3 { get; set; }
        public string col4 { get; set; }
    }
}