В чем проблема с привязкой данных linq - PullRequest
0 голосов
/ 25 июля 2010
<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 #:

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

Если вы запустите код, вы получите сетку, заполненную таблицей категорий NorthWind.Если вы нажмете на командную кнопку сетки, которая находится слева, вы получите поле вставки / обновления, но у вас нет доступа для ввода.Они перешли в режим только для чтения.

Если я заменю приведенный выше синтаксис C # на ниже

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

, тогда он будет работать нормально.Теперь вы можете работать с командной кнопкой без каких-либо проблем.

Я хочу знать, в чем проблема, почему не работает первый синтаксис.Возможно, вы скажете Анонимные типы - это типы классов, которые состоят из одного или нескольких общедоступных свойств, доступных только для чтения. Но когда вам нужно объединить несколько таблиц и выбрать несколько полей, а не все, что вы делаете.Надеюсь, вы не скажете, что linq не может этого сделать или Не думаю, что это возможно. Надеюсь, что должна быть какая-то техника или что-то еще, чтобы связать управление с типом Anonymous .Плз покажи какой-нибудь синтаксис.

Ответы [ 3 ]

2 голосов
/ 28 июля 2010

Проблема в том, что результирующий набор является коллекцией анонимного типа, как вы и предполагали, и сетка не знает, как с этим обращаться. То, что вам нужно сделать, это использовать события 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();
    }

Надеюсь, это поможет.

0 голосов
/ 25 июля 2010

На самом деле вы можете связать с анонимным типом, как вы видите уже заполненные строки.Но: сама сетка не может знать, как вы строите запрос и что дополнительно добавить к видимым столбцам (если есть допустимые значения по умолчанию).

Поскольку вы используете сетку Developer Express, у вас есть возможность предоставить свойсобственную форму обновления / редактирования и обрабатывайте все необходимое самостоятельно.

0 голосов
/ 25 июля 2010

Просто дикая догадка - вы связываете свои данные с сеткой, используя имена полей, - однако у вашего анонимного типа на самом деле нет имен полей.

Имеет ли значение, если вы попробуете этот код:

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

Опять же - у меня нет возможности проверить это прямо сейчас, это просто внутреннее чувство ..... попробуй - это поможет вообще ??

...