【问题标题】:Binding RadGridView with stored procedure's result in EntityFramework在实体框架中将 GridView 与存储过程结果绑定
【发布时间】:2013-12-15 11:12:14
【问题描述】:

我已将存储过程的结果(在实体框架中)存储在 IList 中,然后将我的网格与此 IList 绑定。当此结果为空时,网格没有任何列,但我需要在网格中显示这些列。有没有办法解决这个问题?

这是我的代码:

IList list = new ArrayList();

try
{
    var context = new SabzNegar01Entities1();

    list = (from p in context.tbl_ReturnSalesFactor_D
            let add = (p.MainNum * p.Fee)
            let pureAdd = ((p.MainNum * p.Fee) - (p.MainNum * p.Discount)) + ((p.Tax + p.Charges) * p.MainNum)
            let taxChange = (p.Tax + p.Charges) * p.MainNum
            let discount = p.Discount * p.MainNum
            where p.DocNo == inDocNo
            select new { p.Row, p.StockCode,  p.tbl_Stock.PDescription, p.Fee, p.MainNum, add, taxChange, discount, pureAdd }).ToList();
}
catch (Exception ex)
{
    PMessageBox.Show(ex.Message, "Error in Reading  ReturnSalesFactor_Details Data");
}

和绑定:

radGridView_Product.DataSource = list ;

【问题讨论】:

    标签: c# winforms linq entity-framework radgridview


    【解决方案1】:

    我会这样做:

    • 定义一个与您从存储过程中返回的数据相匹配的 C# 类(例如 SalesInfo 或任何您想调用的名称)

    • 然后将您的IList 定义为List<SalesInfo>不要再使用糟糕的旧ArrayList!)

    • 当您调用存储过程但没有返回任何值时,您只需在返回的列表中添加一个虚拟的 SalesInfo 条目,例如有no data found作为它的描述,其他都是空的/0.0

    这样,您的方法将始终返回至少一个元素,并且由于该元素在那里,gridview 知道它的列以及如何调用它们

    更新:

    我会首先定义一个类来保存您想要在 gridview 中显示的所有属性:

    // just a data container to hold the information - call it whatever you like!
    // also: with the datatypes, I am just *GUESSING* because you didn't exactly tell us
    // what those values are - adapt as needed !
    public class SalesInfo
    {
        public int Row { get; set; }
        public string StockCode { get; set; }
        public string Description { get; set; }
        public decimal Fee { get; set; }
        public decimal MainNum { get; set; }
        public decimal Add { get; set; }
        public decimal TaxChange { get; set; }
        public decimal Discount { get; set; }
        public decimal PureAdd { get; set; }
    }
    

    接下来,定义一个从存储过程中获取数据的方法 - 如果没有返回数据,则添加一个虚拟条目:

    // Define a method to return an IList of that data container class defined above
    public IList<SalesInfo> GetSalesInfo()
    {
        // please, as of .NET 2.0 - use the List<T> and stop using ArrayList!
        IList<SalesInfo> list = new List<SalesInfo>();
    
        try
        {
            // put your context usage into using()..... blocks to ensure proper disposal
            using (var context = new SabzNegar01Entities1())
            {
                 // fetch the data, turn it into SalesInfo records
                 list = (from p in context.tbl_ReturnSalesFactor_D
                         where p.DocNo == inDocNo
                         select new SalesInfo
                                {
                                    Row = p.Row,
                                    StockCode = p.StockCode,
                                    Description = p.tbl_Stock.PDescription,
                                    Fee = p.Fee,
                                    MainNum = p.MainNum,
                                    Add = p.MainNum*p.Fee,
                                    PureAdd = ((p.MainNum*p.Fee) - (p.MainNum*p.Discount)) + ((p.Tax + p.Charges)*p.MainNum),
                                    Discount = p.Discount*p.MainNum,
                                    TaxChange = (p.Tax + p.Charges)*p.MainNum
                                }).ToList();
            }
    
            // if you get back no data -> add a dummy entry
            if (list.Count <= 0)
            {
                 list.Add(new SalesInfo { Description = "(no data found)" });
            }
        }
        catch (Exception ex)
        {
            PMessageBox.Show(ex.Message, "Error in Reading  ReturnSalesFactor_Details Data");
        }
    
        // return the resulting list
        return list;
    }
    

    【讨论】:

    • 我必须使用 foreach 将 SalseInfo 添加到此列表中?我以前做过,但由于这个循环,我的老板想让我更改它。请给我一个例子吗?
    • 还有一个问题:这个解决方案有几个项目:Info、IInfo、Business、IBusiness 和 UI(IInfo 和 IBusiness 是接口,它们的实现在 Info 和 Business 中)。在 UI 项目中我可以只看到接口项目,所以在 IBusiness 项目中它必须是这样的:IList GetSalesInfo();如何将此查询的结果存储在 IList(SalesInfo 的接口)上?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多