Должен ли autogeneratecolumns=true игнорировать datakeys в сетке вида asp.net?
Мой вопрос двоякий: во-первых, является ли ошибкой Microsoft то, что когда установлен атрибут autogeneratecolumns=true для вида сетки asp.net, столбцы создаются даже для полей, перечисленных в атрибуте datakeynames? Конечно, это противоречит всему обоснованию datakeys? Во-вторых, есть ли способ использовать ключи данных без необходимости явного перечисления всех столбцов, не являющихся ключами данных в сетке, в качестве связанных полей, что утомительно и плохо для обслуживания?
В свете комментария AVD я приведу пример: предположим, у меня есть этот запрос в качестве источника для моей сетки
SELECT intAssessmentElementID, strModuleCode, strAssessmentElement,
Weighting, intSemester, SubmissionDate FROM tblAssessmentElements
и я не хочу отображать intAssessmentElementID. Вот мое определение gridview
<asp:GridView ID="grdAssessmentElements" runat="server" DataKeyNames="intAssessmentElementID">
<Columns>
<asp:BoundField HeaderText="Module Code" DataField="strModuleCode" />
<asp:BoundField HeaderText="Element" DataField="strAssessmentElement" />
<asp:BoundField HeaderText="Weighting" DataField="Weighting" />
<asp:BoundField HeaderText="Semester" DataField="intSemester" />
<asp:BoundField HeaderText="Submission Date" DataField="SubmissionDate" />
</Columns>
</asp:GridView>
Запись этих связанных полей утомительна, и если я добавлю поле к запросу, я должен не забыть добавить его и в определение сетки. Если autogeneratecolumns=true, обновление будет автоматическим. Но autogeneratecolumns=true генерирует все столбцы, даже те, которые перечислены в datakeynames. Я думаю, что это противоречиво. Я хотел бы использовать как autogeneratecolumns=true, так и datakeynames, но столбцы datakeynames не отображаются. Я видел множество предложений, чтобы скрыть столбцы после привязки данных, но они не работают для меня и других. Когда столбцы генерируются автоматически, они не отображаются и не генерируются даже в PreRender.
1 ответ
Само определение AutoGenerateColumns выглядит следующим образом (выделено мной):
Получает или задает значение, указывающее, создаются ли автоматически связанные поля для каждого поля в источнике данных.
Если вы не хотите отображать все поля, вы должны вручную создать поле данных для каждого поля, которое вы хотите отобразить. К сожалению, AutoGenerateColumns и DataKeyNames не знают друг друга.
Другой вариант для вас - использовать AutoGenerateColumns, но скрыть ячейки, которые вы не хотите видеть при их создании. Во-первых, зацепить RowCreated
событие.
<asp:GridView ID="grdAssessmentElements" runat="server"
DataKeyNames="intAssessmentElementID"
OnRowCreated="grdAssessmentElements_RowCreated">
Затем в этом случае скрыть ячейку. Проблема в том, что вы должны жестко закодировать индексы. Например, если вы знаете, что первый столбец - это тот, который вы хотите скрыть.
protected void grdAssessmentElements_RowCreated(object sender, GridViewRowEventArgs e)
{
e.Row.Cells[0].Visible = False;
}
Однако это по-прежнему не решает проблему необходимости менять код, как только вы начинаете возвращать новый столбец. Как только вы добавляете новый столбец и не хотите его показывать, вы должны добавить больше кода.
Чтобы ответить на второй вопрос, вы можете использовать DataKeys в любое время. Вы можете использовать его с AutoGenerateColumns и скрывать ячейки самостоятельно. Или вы можете использовать его и явно перечислить ваши столбцы.
Я предпочитаю перечислять каждый столбец. Таким образом, если запрос когда-либо изменится без вашего ведома, вы знаете, что ваш GridView никогда не будет отображать то, что не должен отображаться. Я никогда не находил это настолько утомительным, как ты думаешь.