2010-07-25 39 views
0
<dx:ASPxGridView ID="ASPxGridView1" runat="server" AutoGenerateColumns="False" 
      KeyFieldName="CategoryID"> 
    <SettingsEditing Mode="Inline" /> 
    <Columns> 
     <dx:GridViewCommandColumn VisibleIndex="0"> 
     <EditButton Visible="True"></EditButton> 
     <NewButton Visible="True"></NewButton> 
     <DeleteButton Visible="True"></DeleteButton> 
     </dx:GridViewCommandColumn> 
     <dx:GridViewDataTextColumn Caption="CategoryID" FieldName="CategoryID" 
        VisibleIndex="1"> 
     </dx:GridViewDataTextColumn> 
     <dx:GridViewDataTextColumn Caption="CategoryName" FieldName="CategoryName" 
        VisibleIndex="2"> 
     </dx:GridViewDataTextColumn> 
     <dx:GridViewDataTextColumn Caption="Description" FieldName="Description" 
        VisibleIndex="3"> 
     </dx:GridViewDataTextColumn> 
    </Columns> 
</dx:ASPxGridView> 

C#語法:什麼是LINQ的問題數據綁定

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

如果您運行的代碼,你這是羅斯文分類表填寫一個gridview。如果點擊位於左側的網格命令按鈕,則會出現插入/更新字段,但您無法輸入。他們去了只讀模式。

如果我更換下面

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

然後正常工作上面的C#語法。現在,您可以使用命令按鈕,而無需面對任何問題。

我想知道問題是什麼,爲什麼第一個語法不起作用。也許你會說 匿名類型是由一個或多個公共只讀屬性組成的類類型。但是當你需要加入多個表格並且需要選擇幾個不是你所做的事情的領域時。希望你不要說linq沒有那麼做或者不要以爲這是可能的。希望必須有任何技術或其他東西來綁定控制匿名類型。 Plz顯示一些語法。

+0

我添加了一個devexpress標籤,因爲您使用它,並且網格表現與標準網格非常不同。 – Sascha 2010-07-25 18:06:41

回答

0

只是一個瘋狂的猜測 - 你使用字段名稱將數據綁定到網格 - 但是,你的匿名類型並沒有任何字段名稱。

這有什麼區別,如果你試試這個代碼:

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(); 

再次 - 我沒有現在來測試這一權利的手段,它只是一種基本的感覺.....試試吧 - 這些幫助有用??

+0

我已經這樣做了,它不工作。爲什麼不嘗試運行上面的語法 – shamim 2010-07-26 05:22:43

0

實際上,您可以使用匿名類型進行綁定,因爲您會看到已經填充的行。但是:網格本身無法知道如何構建查詢以及要在可見列上添加什麼(如果有有效的默認值)。

當您使用Developer Express'網格時,您可以選擇提供自己的更新/編輯表單並自行處理所有需要的內容。

+0

我不明白你想說什麼。請你詳細解釋它,並給我演示一些語法來解決這個問題 – shamim 2010-07-26 05:24:49

+0

As marc_s已經說過,匿名類型沒有綁定的列名。此外,您將丟失數據庫處理數據的每一點信息,每個數據可能來自不同的表格。沒有一個標準的軟件可能知道如何在不訪問某些基本信息的情況下將數據添加到數據庫中。 看看http://demos.devexpress.com/ASPxGridViewDemos/GridEditing/EditFormTemplate.aspx。該樣本應該指導你。 – Sascha 2010-07-27 05:49:31

2

問題是,結果集是匿名類型的集合,因爲你應該和網格不知道如何處理它。你所要做的就是使用Grid的RowInserting和RowUpdating事件。 下面是如何使用的DevExpress網格NHibernate的一個例子:

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(); 
    } 

我希望這將有助於。