Несколько DataKeyNames в GridView - PullRequest
       8

Несколько DataKeyNames в GridView

7 голосов
/ 28 ноября 2008

У меня есть GridView, заполненный из ObjectDataSource двумя элементами в его поле DataKeyNames. Один - это первичный ключ, ID, другой - поле категории (поле категории используется для добавления строк заголовка для разграничения категорий).

Отображение работает нормально, но я пытаюсь создать действие Удалить. Метод удаления объекта нуждается только в поле идентификатора и в ObjectDataSource, даже если я определяю метод как требующий только поле идентификатора, .net жалуется, потому что ищет метод, в котором оба поля определены в DataKeyNames.

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

Могу ли я сконфигурировать объекты ObjectDataSource и GridView, чтобы они имели два значения для DataKeyNames, но конкретные, которые должны быть переданы каким методам?

(упрощенные) определения для двух объектов:

<asp:ObjectDataSource ID="ObjDS1" runat="server" SelectMethod="getAllItems" 
    TypeName="Items" DeleteMethod="deleteItem">
    <DeleteParameters>
        <asp:Parameter Name="ID" Type="Int32" />
       <!-- This shouldn't be necessary: -->
        <asp:Parameter Name="Category" Type="String" />
    </DeleteParameters>
</asp:ObjectDataSource>

<asp:GridView ID="gvJItems" runat="server" AutoGenerateColumns="False" DataKeyNames="ID,Category" 
    DataSourceID="ObjDS1">
        <Columns>
            <asp:BoundField DataField="ID" Visible="false"  HeaderText="ID" />
            <asp:BoundField DataField="Name" HeaderText="Name" ItemStyle-Width="85%"/>
            <asp:TemplateField>
                <ItemTemplate>
                    <asp:LinkButton ID="lbDelete" Runat="server" 
                        OnClientClick="return confirm('Are you sure you want to delete this?');"
                            CommandName="Delete">Delete</asp:LinkButton>
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>

Ответы [ 4 ]

9 голосов
/ 28 ноября 2008

Все значения DataKey всегда будут передаваться методу Delete, поскольку поля, названные DataKeyNames , предназначены для того, чтобы быть полем или полями, которые однозначно идентифицируют этот элемент в GridView. Они часто используются более чем для простой поддержки дополнительных полей для каждой строки в ViewState, как вы здесь, но это имеет побочный эффект, который вы видите с методами ObjectDataSource.

Чтобы ответить на ваш исходный вопрос, нет, вы не можете иметь Category в DataKeyNames, не передав ее в метод Delete. Однако вы можете сохранить значение в ViewState, поместив его в скрытый вход в столбце шаблона. Однако было бы больше работы, чтобы получить это значение, чем игнорировать параметр метода Delete.

1 голос
/ 02 февраля 2012

Вы можете удалить их, используя ObjectDataSource обновление / удаление события

void ODS_Updating(Object sender, ObjectDataSourceMethodEventArgs e)
{
  e.InputParameters.Remove("Type_ID");
  e.InputParameters.Remove("Document_ID");
  e.InputParameters.Remove("State_ID");
}

Я использую DataKeys для поиска, но они мне не нужны в моей процедуре обновления.

1 голос
/ 18 ноября 2011

У меня была та же проблема с моим gridview с источником данных объекта, как я справился с этой ситуацией: я использую StoredProcs в конце SQL. Я добавил еще один параметр в процедуру сохранения, хотя он мне не нужен. Работало нормально

0 голосов
/ 28 ноября 2008

При использовании метода декларативного удаления по умолчанию GridView передает оба значения в ObjectDataSource.

Если вам действительно не нравится дополнительный параметр, альтернативой является отмена декларативного метода и использование собственного (вы можете удалить ненужный параметр там), но для этого требуется больше кода.

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