Загрузка значений внешнего ключа с помощью элемента управления DynamicDataManager в столбец Gridview на обычных страницах asp.net страницы

#asp.net #.net #asp.net-dynamic-data

#asp.net #.net #asp.net-dynamic-data

Вопрос:

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

Я наткнулся на элемент управления dynamicdataManager, который будет использоваться для этого сценария, и обнаружил, что его можно легко использовать в Asp.net веб-формы, и тогда нет необходимости создавать специальный веб-сайт с динамическими данными.

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

Структура таблиц :

 CREATE TABLE [dbo].[LK_CardType](
    [CardTypeID] [int] IDENTITY(1,1) NOT NULL,
    [CardTypeName] [nvarchar](50) NOT NULL,
    [AdditionalNotes] [nvarchar](50) NOT NULL,
    [Ref_ID] [int] NULL, --this is referring to another table called RefTes(ReferenceTest)
 CONSTRAINT [PK_LK_CardType] PRIMARY KEY CLUSTERED (    [CardTypeID] ASC ) ) ON [PRIMARY]

GO
ALTER TABLE [dbo].[LK_CardType]  WITH CHECK ADD  CONSTRAINT [fk_cardtype_RefTest] FOREIGN KEY([Ref_ID])
REFERENCES [dbo].[RefTest] ([Ref_Id])
GO
  

Родительская таблица

 CREATE TABLE [dbo].[RefTest](
    [Ref_Id] [int] IDENTITY(1,1) NOT NULL,
    [Ref_Name] [nvarchar](50) NOT NULL,
 CONSTRAINT [PK_RefTest] PRIMARY KEY CLUSTERED 
(
    [Ref_Id] ASC
)
) ON [PRIMARY]
  

Я создал LinqDataSource для этих двух таблиц, и отношения классов отображаются на диаграмме ниже :

введите описание изображения здесь

Теперь у меня есть динамические поля в моем gridview для отображения списка типов lk_card, одно из которых ссылается на имя ссылочного класса «RefTest». Когда я запускаю свою страницу, я вижу имя класса вместо значения из ссылочной таблицы «RefTest».

Я знаю, что мне чего-то не хватает, поскольку я нигде не упоминал в коде, что Ref_Name сопоставляется с Ref_Id .

Моя Html-разметка для gridview :

 <table>
<tr>
        <td colspan="3">
   <asp:DynamicDataManager ID="DynamicDataManager1"    AutoLoadForeignKeys="true"  runat="server">


     <%-- <DataControls><asp:DataControlReference ControlID="GridView1"  /></DataControls> --%>


      </asp:DynamicDataManager>
        </td>
    </tr>
</table>

    <asp:GridView ID="GridView1" runat="server"  AutoGenerateColumns="False" 
        DataKeyNames="CardTypeID" DataSourceID="LinqDataSource" >
        <Columns>
               <asp:CommandField ShowDeleteButton="True" ShowEditButton="True" 
                   ShowSelectButton="True" />
               <asp:DynamicField DataField="CardTypeID" />
               <asp:DynamicField DataField="CardTypeName" />
               <asp:DynamicField DataField="AdditionalNotes" />
               <asp:DynamicField DataField="RefTestValue" />

</Columns>
    </asp:GridView>
        <asp:LinqDataSource  ID="LinqDataSource" runat="server" 
            ContextTypeName="JqueryGrid_MasterData.MasterTableDataContext" 
            EntityTypeName="" TableName="LK_CardTypes"  EnableDelete="True" 
            EnableInsert="True" EnableUpdate="True">
        </asp:LinqDataSource>
  

В событии Page_Init я включил динамические данные в gridview и зарегистрировал элемент управления с помощью элемента управления DynamicDataManager

   GridView1.EnableDynamicData(typeof(LK_CardType));
          DynamicDataManager1.RegisterControl(GridView1);
  

Нужны ли мне какие-то настройки на уровне полей элемента управления Gridview или нужны какие-то настройки в LinqDataSource ?

Комментарии:

1. Вы решили это? Я вижу, что вы опубликовали тот же вопрос на форумах aspnet. У меня здесь похожие проблемы, и я думаю, что этого невозможно достичь без регистрации всего DataContext в файле global.asax. Метод EnableDynamicData использует более простой генератор метатабель, который вообще не учитывает связанные модели.

Ответ №1:

Возможно, вы сможете выполнить эту работу:

 <asp:GridView ID="GridView2" runat="server" AutoGenerateColumns="False" 
    DataKeyNames="CardTypeID" DataSourceID="LinqDataSource">
    <Columns>
        <asp:CommandField ShowDeleteButton="True" ShowEditButton="True"
             ShowSelectButton="True" />
        <asp:DynamicField DataField="CardTypeID" />
        <asp:DynamicField DataField="CardTypeName" />
        <asp:DynamicField DataField="AdditionalNotes" />
        <asp:TemplateField>
            <ItemTemplate>
                <%# Eval("RefTest.Ref_Name") %>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>
  

Конечно, вы не сможете редактировать значение RefTest.Ref_Name

Комментарии:

1. Но идея состоит не только в том, чтобы показать имя, идея состоит в том, чтобы иметь аналогичное поведение, которое мы получаем на веб-сайте dynamic data, поэтому мне нужны все операции добавления, редактирования и удаления. Я видел, как некоторые эксперты предлагали скопировать всю динамическую папку из tempate веб-приложения с динамическими данными в существующее приложение web forms.