2017-03-03 252 views
1

我编写了一个使少数列表成功的代码。最后,我得到以下列表:将列表数组添加到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++; 

    } 

现在,我已经包含按钮的用户界面和Datagrid使用混合,我希望这些列表显示在Datagrid列中,一旦我点击按钮。

我到目前为止所做的是将此代码插入按钮xaml.cs. 事情即时通讯不知道该怎么办是,如果我可以写按钮xaml.cs内显示的代码也必须是在DataGrid和最新正确的代码把它显示在列:

column 1: 
list_AmountNeed 

column 2: 
list_TotalCost 

和等等。

谢谢!

+0

听起来像你拥有的是一个列表集合,每个列表中给定索引处的每个数据在逻辑上代表一个“数据行”为你的网格。这是一个非常全面而且可能不太可行的做事方式。我建议将它们加载到更适合于此的数据结构中,如数据表,然后将其绑定到网格。要么,要么创建一个对象层次结构(聚合)并使用对象绑定。 –

+0

我想过,如何绘制一个界面在混合使它看起来非常好,我只能绘制数据网格而不是表格。 – Ben

+0

不,我不是在谈论不使用数据网格,我正在谈论你*绑定到数据网格的数据结构。签出https://msdn.microsoft.com/en-us/library/system.data.datatable(v=vs.110).aspx –

回答

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 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); 
} 
+0

谢谢队友,但是,如果Amount的值例如arent = 1,但它们是在代码中早先计算的向量/数组? – Ben

+0

@ben,那么也许你应该在问题中包含你现有的类代码。没有任何关于它们的知识,我所能做的就是给出关于datagrid数据绑定的一般建议 – ASh

+0

我编辑了这些问题以使其更加清晰。谢谢。 – Ben

0

非常相似,灰,使用同样的原则。我的datagrid是在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; } 
    } 
}