2009-11-27 5 views
0

Я просто играю с некоторыми linq и asp.net - абсолютным новичком, поэтому я даже не уверен точно, как задать свой вопрос.Подключение gridview к нескольким таблицам linqdatasource

В любом случае, у меня есть база данных MSSQL с информацией о членстве asp. По разным причинам (в основном для хранения информации профиля в прозрачных столбцах вместо всех в одном) я использую настраиваемый поставщик профилей, поэтому моя информация профиля распространяется по нескольким таблицам в моей базе данных.

У меня есть обычное aspnet_membership и aspnet_profle, но у меня также есть таблица tblUserProfile, в которой я храню кучу информации о профиле пользователя, например, имя, номер телефона и т. Д. В этом файле tblUserProfile также есть идентификатор компании, ссылаясь на отдельный стол со списком компаний в нем.

Все таблицы имеют GUID UserId как их ключ. Я создал диаграмму datamodel, которая содержит все таблицы, которые я использую, и правильно показывает ключи, соединяющие и т. Д.

Итак, теперь у меня есть gridview, который использует LinqDataSource, который подключен к таблице aspnet_membership. Этот бит до сих пор хорошо работает, я могу отображать всю информацию в таблице aspnet_membership. Я также понял, как показать компанию пользователь находится в так:

    <asp:TemplateField HeaderText="Company" SortExpression="tblUserProfile.Company.CompanyName"> 
         <ItemTemplate> 
          <%#Eval("tblUserProfile.Company.CompanyName") %> 
         </ItemTemplate> 

То, что я не могу понять, как внести изменения в это сохранить в базе данных. Если я изменяю прямые поля в таблице aspnet_membership, они обновляются правильно.

Я создал раскрывающийся список, показывающий все доступные компании, вы можете выбрать компанию для изменения непосредственно в сетке, но когда я пытаюсь ее обновить, она возвращается к исходному значению.

    <asp:TemplateField HeaderText="Company" SortExpression="tblUserProfile.Company.CompanyName"> 
         <ItemTemplate> 
          <%#Eval("tblUserProfile.Company.CompanyName") %> 
         </ItemTemplate> 
         <EditItemTemplate> 
          <asp:DropDownList ID="CompanyDropDownList" 
               DataSourceID="CompanyDataSource" 
               DataValueField="Id" 
               DataTextField="CompanyName" 
               SelectedValue='<%#Bind("tblUserProfile.CompanyID") %>' 
               runat="server"> 
               </asp:DropDownList> 

         </EditItemTemplate> 
        </asp:TemplateField> 

Я не уверен, если это потому, что мой источник данных подключается к одной таблице (aspnet_membership), но значение, которое я пытаюсь изменить в tblUserProfile. Кажется, что я могу извлекать/отображать значения из других таблиц, связанных через внешние ключи, но могу ли я также обновлять значения в этих таблицах?

Извините за длинный вопрос, но я довольно новичок в этом, поэтому не знаю точно, где проблемы, в противном случае, я был бы более конкретным.

Спасибо за любые указатели

ответ

1

Похоже, вы пытаетесь использовать автоматическое обновление, представленное LinqDataSource, но, как вы отмечаете, что не работает должным образом соединяемые данные. Это ограничение автоматического обновления. Однако вы можете подписаться на одно из событий OnUpdating и написать код для обработки дополнительного обновления. Как именно это должно быть написано, зависит от имен ваших ключевых значений и т. Д., Но на этом сайте и в других местах должна быть информация о нем.

+0

Ах право ... Да, я пытался использовать автоматическое обновление. Я следил за учебником, который работал с гораздо более простой базой данных, но пытался адаптировать его к моей собственной. Мне нужно выяснить код для обработки дополнительного обновления, теперь, когда я знаю, что это нужно сделать. Вы знаете какую-либо документацию, в которой говорится об ограничениях автообновления? – Adam

+0

Я не уверен в документации, хотя я уверен, что она там, но в целом, если речь идет о присоединениях или в основном к чему-то «причудливому», она не будет работать с автоматическим обновлением, и вам придется писать на хотя бы какой-то код. –

0

Вы можете создать пользовательский элемент управления с привязкой к данным для редактирования объектов суб

public class CompositeBoundField : BoundField 
{ 
    protected override object GetValue(Control controlContainer) 
    { 
     object item = DataBinder.GetDataItem(controlContainer); 
     return DataBinder.Eval(item, this.DataField); 
    } 
} 

И затем использовать на странице так:

  <cc:CompositeBoundField DataField="aspnet_Membership.Email" HeaderText="Email"/> 

Затем добавьте в сети.конфигурации:

<pages> 
     <controls> 
      <add assembly="App_Code" namespace="CustomControls" tagPrefix="cc"/> 
     </controls> 

Позвольте мне знать, если это поможет, давая мне повышающий чек. Можно создать другие связанные поля для флажка или других типов. Это может быть оригинальный автор/источник для этого метода:

http://iridescence.no/post/FixingBoundFieldSupportforCompositeObjects.aspx