Проблема с командой обновления в gridview

У меня есть gridview с некоторыми данными из моей базы данных, и каждая строка что-то контролирует (в реальном мире). В одном из столбцов указано, включен или отключен мониторинг (0 или 1). Я добавил столбец (Templatefield) в gridview с помощью LinkButton. Этот TemplateField объявлен следующим образом:

<asp:TemplateField HeaderText="Action">
    <ItemTemplate>
        <asp:LinkButton ID="LinkButton1" class="btn" runat="server" CausesValidation="false" 
            CommandName="Update" Text='<%# Eval("Disable").ToString() == "1" ? "Enable" : "Disable" %>'></asp:LinkButton>
    </ItemTemplate>
</asp:TemplateField>

Как видите, свойство Текст кнопки имеет значение «Включить» (если мониторинг в данный момент отключен) или «Отключить» (если мониторинг в данный момент включен). Это прекрасно работает.

Представление сетки связано с ObjectDataSource, а кнопка Link связана с командой Update указанного источника данных. Команда Update ObjectDataSource вызывает метод из одной из моих DLL, и мне нужно передать значение (0 или 1), которое будет записано в базу данных.

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

Моя проблема связана с событием обновления в ObjectDataSource. Я не могу передать какие-либо параметры

protected void ods_Updating(object sender, ObjectDataSourceMethodEventArgs e)
{
    //I would like to accomplish something like
    e.InputParameters["value"] = isItEnabled ? 0 : 1;
}

Любые идеи о том, как действовать?

Редактировать 1: Моя разметка ods

<asp:ObjectDataSource ID="odsHistoriqueSurveillance" runat="server" 
    OldValuesParameterFormatString="original_{0}" 
    onselecting="odsHistoriqueSurveillance_Selecting" SelectMethod="getHistorique" 
    TypeName="WebOrderProcessingBLL.SRVCheckValueBLLWrapper" 
    onUpdating="ods_Updating"
    UpdateMethod="EnableOrDisableSurveillanceFromHistorique">
    <SelectParameters>
        <asp:Parameter Name="ParamName" Type="String" />
    </SelectParameters>
    <UpdateParameters>
        <asp:Parameter Name="original_id" Type="Int32" />
        <asp:Parameter Name="value" Type="Byte" />
    </UpdateParameters>
</asp:ObjectDataSource>

person WizLiz    schedule 29.01.2014    source источник
comment
Не могли бы вы показать свою разметку ObjectDataSource?   -  person Josh Darnell    schedule 29.01.2014
comment
@jadarnel27 обновил пост   -  person WizLiz    schedule 29.01.2014
comment
Можно ли получить доступ к полю «Отключить» из метода «Обновление», если изменить Text='<%# Eval("Disable").ToString() == "1" ? "Enable" : "Disable" %>' только на Text='<%# Bind("Disable") %>'?   -  person Josh Darnell    schedule 29.01.2014
comment
@WizLiz ЕСЛИ вам нужно только сохранить значение в базе данных, можете ли вы попробовать использовать событие Row_Command?   -  person Suraj Singh    schedule 03.02.2014


Ответы (4)


Найдите свой LinkButton в событии Updating, как показано ниже:

LinkButton lb = (LinkButton) GridView1.Rows[GridView1.EditIndex].FindControl("LinkButton1");
if(lb!=null){
  //Now check what is the Text of your link button. Depending on Enable or disable you set the parameter value as needed
  e.InputParameters["value"] = lb.Text=="Disable"? 0 : 1;
}
person gbs    schedule 31.01.2014
comment
Мне нравится это решение, попробую как можно скорее. - person WizLiz; 04.02.2014

Что я делаю в этих ситуациях, так это добавляю событие onClick к элементу ввода, по которому вы щелкаете, а затем добавляю все значения, которые мне нужны в качестве атрибутов, примерно так:

<asp:TemplateField HeaderText="Action">
   <ItemTemplate>
       <asp:LinkButton ID="LinkButton1" class="btn" runat="server" 
           CommandName="Update" Text='<%# Eval("Disable").ToString() == "1" ? "Enable" : "Disable" %>' OnClick="DoSomething" id='<%# Eval("RecordID")'></asp:LinkButton>
   </ItemTemplate>
</asp:TemplateField>

И в коде:

protected void DoSomething(object sender, EventArgs e)
{
   var id = (sender as LinkButton).Attributes["RecordID"];
   var state = (sender as LinkButton).Text;
}
person Andrei Dvoynos    schedule 31.01.2014

В соответствии с вашей разметкой ObjectDataSource определите методы как

    public void EnableOrDisableSurveillanceFromHistorique(int origional_id, byte value)
    {
    }

Дополнительные сведения см. в разделе Источник данных объекта Строгий тип источника

Также отредактируйте разметку ODS как

    <UpdateParameters>
        <asp:ControlParameter ControlID="control" Name="origional_id" PropertyName="SelectedValue" Type="int" />
    <asp:ControlParameter ControlID="control" Name="value" PropertyName="SelectedValue" Type="byte" />
    </UpdateParameters>        
person Rajesh Puniya    schedule 03.02.2014

person    schedule
comment
не имеют ни одного из этих свойств на e - person WizLiz; 03.02.2014
comment
@WizLiz вам нужен GridView1.EditIndex, как упоминалось в моем ответе выше. - person gbs; 03.02.2014