#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.