Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将两个不同类中的信息组合在一起,以便在列表框中显示结果?_C#_Wpf_Listbox - Fatal编程技术网

C# 如何将两个不同类中的信息组合在一起,以便在列表框中显示结果?

C# 如何将两个不同类中的信息组合在一起,以便在列表框中显示结果?,c#,wpf,listbox,C#,Wpf,Listbox,我的程序包含两个不同的类。我想将两者的值组合起来,只在列表框中显示结果信息。信息存储在数据库中,我的代码中的类是由LINQ to SQLDataClass创建的 一级(反应器参数) 本课程包含特定时间内反应器的相关信息,如火焰温度、油量、空气量 类别定义: 示例数据: 二等(产品信息) ProductInformation类存储关于反应器在什么时间段生产的产品的信息 类别定义: 示例数据: 我希望结果是什么样的? 我想要实现的是将反应器参数与给定时间生产的产品相结合 这是一项简单的任务。你

我的程序包含两个不同的类。我想将两者的值组合起来,只在
列表框中显示结果信息。信息存储在数据库中,我的代码中的类是由LINQ to SQL
DataClass
创建的

一级(反应器参数)

本课程包含特定时间内反应器的相关信息,如火焰温度、油量、空气量

类别定义:

示例数据:

二等(产品信息)

ProductInformation
类存储关于反应器在什么时间段生产的产品的信息

类别定义:

示例数据:

我希望结果是什么样的?

我想要实现的是将反应器参数与给定时间生产的产品相结合

这是一项简单的任务。你为什么这么问?

当然,我可以创建一个新类,为每个
反应器参数
创建一个实例,并在其中存储相关的
产品
。但是,由于这只是出于UI目的(我不需要额外的类来完成任何事情),我不确定是否有更好的方法来实现这一目标。我听说过
CompositeCollection
CollectionView
,但我不确定这是否对我有帮助


那么,除了使用单独的类来填充我的
列表框
,还有其他方法吗?

在我看来,我应该选择一个包含这些类作为属性的新类。这种方式允许您在将来扩展,以防您需要更多的属性

public class ProductReactorModel
{
    public ReactorParameters ReactorParameters {get;set;}
    public ProductInformation ProductInformation {get;set;}
}
然后创建新创建的类的列表
list
。将此列表绑定到列表框。使用该类,您可以访问要显示在您的列表框中的类和属性。在列表框内按以下方式绑定

{Binding ReactorParameters.Time}

您必须创建视图类来绑定它

尝试以下代码(我将
产品
替换为
字符串
进行测试):

公共类反应器参数
{
公共时间跨度时间{get;set;}
公共双温{get;set;}
公共双油{get;set;}
公共双空气{get;set;}
}
公共类产品信息
{
来自{get;set;}的公共时间跨度时间
公共时间跨度时间_到{get;set;}
公共字符串乘积{get;set;}
}
公共类ReactorView
{
公共ReactorParameters参数{get;set;}
公共产品信息产品{get;set;}
}
/// 
///入口点
/// 
公开无效测试()
{
随机rnd=新随机数(1000);
//随机参数
列表参数=(从Enumerable.Range(0,24)中的i开始)
选择新的反应器参数
{
时间=时间跨度从小时(i),
温度=rnd.NextDouble()*50.0,
机油=rnd.NextDouble()*20.0,
Air=rnd.NextDouble()*30.0,
}).ToList();
//产品信息
列出产品=(从可枚举范围(0,4)中的i开始)
选择新产品信息
{
Time_From=时间跨度From小时(i*6),
Time_To=时间跨度从小时(i*6+6),
Product=“Product”+(char)('A'+i),
}).ToList();
//结合
var结果=参数。从产品中的产品中选择多个(参数=>

其中param.Time>=product.Time\u From&¶m.Time=product.Time\u From&¶m.Time您希望在
列表框中(仅一列)还是
网格中(多列)?@ANewGuyInTown我已经用一个自定义的
DataTemplate
设置了一个
ListBox
的样式。这个
DataTemplate
包含一个
Grid
和许多列。我在每个单元格中放置了一个
TextBox
,因此结果看起来像是一个只读的
DataGrid
。我的
ListBox
已经显示了所有
ReactorPa参数
,但缺少
产品信息
。好吧,从我看来,创建一个“视图”类是可行的。我不是100%确定。感谢您的代码示例,SelectMany查询很简洁-我应该更经常地使用它。我添加了带有两个条件选择的可选查询,结果是相同的。
public class ProductReactorModel
{
    public ReactorParameters ReactorParameters {get;set;}
    public ProductInformation ProductInformation {get;set;}
}
{Binding ReactorParameters.Time}
public class ReactorParameters
{
    public TimeSpan Time { get; set; }

    public double Temperature { get; set; }

    public double Oil { get; set; }

    public double Air { get; set; }
}

public class ProductInformation
{
    public TimeSpan Time_From { get; set; }

    public TimeSpan Time_To { get; set; }

    public string Product { get; set; }
}

public class ReactorView
{
    public ReactorParameters Parameters { get; set; }
    public ProductInformation Product { get; set; }
}

/// <summary>
/// entry point
/// </summary>
public void Test()
{
    Random rnd = new Random(1000);

    // random parameters
    List<ReactorParameters> parameters = (from i in Enumerable.Range(0, 24)
                                          select new ReactorParameters
                                          {
                                              Time = TimeSpan.FromHours(i),
                                              Temperature = rnd.NextDouble() * 50.0,
                                              Oil = rnd.NextDouble() * 20.0,
                                              Air = rnd.NextDouble() * 30.0,
                                          }).ToList();

    // product information
    List<ProductInformation> products = (from i in Enumerable.Range(0, 4)
                                         select new ProductInformation
                                         {
                                             Time_From = TimeSpan.FromHours(i * 6),
                                             Time_To = TimeSpan.FromHours(i * 6 + 6),
                                             Product = "Product " + (char)('A' + i),
                                         }).ToList();


    // combine
    var result = parameters.SelectMany(param => from product in products
                                                where param.Time >= product.Time_From && param.Time <= product.Time_To
                                                select new ReactorView
                                                {
                                                    Parameters = param,
                                                    Product = product
                                                });

    // alternative query
    var resultAlt = from param in parameters
                 from product in products
                 where param.Time >= product.Time_From && param.Time <= product.Time_To
                 select new ReactorView
                 {
                     Parameters = param,
                     Product = product
                 };

    // print result
    foreach (var item in result)
    {
        Console.WriteLine("{0,-5} {1,-8:0.00} {2,-8:0.00} {3,-8:0.00} {4,-10}",
            item.Parameters.Time, item.Parameters.Temperature, item.Parameters.Air, item.Parameters.Oil, item.Product.Product);
    }
}