Должен ли 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 никогда не будет отображать то, что не должен отображаться. Я никогда не находил это настолько утомительным, как ты думаешь.

Другие вопросы по тегам