linq数据绑定有什么问题

linq数据绑定有什么问题,linq,linq-to-sql,asp.net-3.5,devexpress,linq-to-objects,Linq,Linq To Sql,Asp.net 3.5,Devexpress,Linq To Objects,如果运行代码,将得到一个由NorthWind Categories表填充的gridview。若你们点击左边网格的命令按钮,你们会得到插入/更新字段,但你们并没有权限给出输入。它们将进入只读模式 如果我将上面的C语法替换为下面的 NorthwindDataContext db = new NorthwindDataContext(); var lresult = (db.Categories .Select(p => new { p.CategoryID, p

如果运行代码,将得到一个由NorthWind Categories表填充的gridview。若你们点击左边网格的命令按钮,你们会得到插入/更新字段,但你们并没有权限给出输入。它们将进入只读模式

如果我将上面的C语法替换为下面的

NorthwindDataContext db = new NorthwindDataContext();
var lresult = (db.Categories
                .Select(p => new { p.CategoryID, p.CategoryName, p.Description}));           
ASPxGridView1.DataSource = lresult;
ASPxGridView1.DataBind();
那么它工作得很好。现在,您可以使用命令按钮而不必面对任何问题

我想知道问题是什么,为什么第一个语法不起作用。也许你会说
匿名类型是由一个或多个公共只读属性组成的类类型。但是,当您需要连接多个表并且需要选择多个字段时,您所做的并不是全部。希望你不要说linq做不到或者认为这是不可能的。希望必须有任何技术或其他东西来绑定匿名类型的控件。请展示一些语法。

只是一个猜测-您正在使用字段名将数据绑定到网格-但是,您的匿名类型实际上没有任何字段名

如果您尝试以下代码,是否会有任何区别:

NorthwindDataContext db = new NorthwindDataContext();
var lresult = (db.Categories);        
ASPxGridView1.DataSource = lresult;
ASPxGridView1.DataBind();

再一次-我现在没有办法测试,这只是一种直觉。。。。。试试看-这有帮助吗???

当您看到已经填充的行时,实际上可以使用匿名类型绑定。但是:如果存在有效的默认值,网格本身无法知道如何构建查询以及如何向可见列中添加其他内容


当您使用Developer Express的网格时,您可以选择提供自己的更新/编辑表单并自行处理所需的所有内容。

问题在于,结果集是您认为的匿名类型集合,网格不知道如何处理它。您需要做的是使用网格的行插入和行更新事件。 以下是我如何将DevExpress网格与NHibernate一起使用的示例:

NorthwindDataContext db = new NorthwindDataContext();

var lresult = (db.Categories
               .Select(p => new { CategoryID = p.CategoryID, 
                                  CategoryName = p.CategoryName, 
                                  Description = p.Description}));           

ASPxGridView1.DataSource = lresult;
ASPxGridView1.DataBind();

我希望这会有所帮助。

我在您使用时添加了一个devexpress标记,该网格的行为与标准网格非常不同。我已经这样做了,它不起作用。为什么不尝试运行上面的syntaxI?我不明白您想说什么。请您详细解释一下,并向我展示一些语法来解决这个问题,正如marc_已经说过的,匿名类型没有要绑定的列名称。此外,还将丢失数据库如何处理数据的所有信息,每个数据可能来自不同的表。没有一个单一的标准软件可能知道如何在没有访问一些基本信息的情况下向数据库添加数据。看一看。这个样品应该能给你指路。
NorthwindDataContext db = new NorthwindDataContext();

var lresult = (db.Categories
               .Select(p => new { CategoryID = p.CategoryID, 
                                  CategoryName = p.CategoryName, 
                                  Description = p.Description}));           

ASPxGridView1.DataSource = lresult;
ASPxGridView1.DataBind();
protected void gridAgentGroups_RowInserting(object sender, DevExpress.Web.Data.ASPxDataInsertingEventArgs e)
    {
        ASPxGridView currentGrid = sender as ASPxGridView;

        var currentAgentGroup = new AgentGroup();
        if (e.NewValues.Contains("Name"))
        {
            var newValue = (string)e.NewValues["Name"];
            currentAgentGroup.Name = newValue;
        }
        if (e.NewValues.Contains("PhysicalAddress"))
        {
            var newValue = (string)e.NewValues["PhysicalAddress"];
            currentAgentGroup.PhysicalAddress = newValue;
        }

        AgentGroupsDataAccess.SaveAgentGroup(currentAgentGroup);

        e.Cancel = true;
        currentGrid.CancelEdit();
        currentGrid.DataBind();

    }

    protected void gridAgentGroups_RowUpdating(object sender, DevExpress.Web.Data.ASPxDataUpdatingEventArgs e)
    {
        ASPxGridView currentGrid = sender as ASPxGridView;

        int currentAgentGroupId = (int)((AgentGroup)currentGrid.GetRow(currentGrid.EditingRowVisibleIndex)).Id;
        var currentAgentGroup = AgentGroups.Where(ag => ag.Id == currentAgentGroupId).FirstOrDefault();

        if (e.NewValues.Contains("Name"))
        {
            var newValue = (string)e.NewValues["Name"];
            currentAgentGroup.Name = newValue;
        }
        if (e.NewValues.Contains("PhysicalAddress"))
        {
            var newValue = (string)e.NewValues["PhysicalAddress"];
            currentAgentGroup.PhysicalAddress = newValue;
        }

        AgentGroupsDataAccess.SaveAgentGroup(currentAgentGroup);

        e.Cancel = true;
        currentGrid.CancelEdit();
        currentGrid.DataBind();
    }