EditItemTemplate: условная привязка

В соответствии с определенным значением строки (Тип) я должен использовать TextBox или DropDownlist внутри EditTemplateField (только ОДИН из них). Как я могу привязать условные элементы управления внутри EditItemTemplate, чтобы сообщить UpdateMethod, какой элемент управления следует учитывать для поля «Значение»?

<asp:TemplateField>
    <ItemTemplate>
        <asp:Label ID="LabelType" runat="server" Text='<%# Eval("Type") %>'></asp:Label>
    </ItemTemplate>
    <EditItemTemplate>
        <asp:Label ID="LabelType" runat="server" Text='<%# Eval("Type") %>'></asp:Label>
    </EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField >
    <ItemTemplate>
        <asp:Label ID="LabelValue" runat="server" Text='<%# Eval("Value") %>'></asp:Label>
    </ItemTemplate>
    <EditItemTemplate>
        <div style="text-align:center">
            <asp:TextBox ID="TextBoxValue" runat="server" Text='<%# Bind("Value") %>'></asp:TextBox>
            <asp:DropDownList ID="DropDownListValue" runat="server" SelectedValue='<%# Bind("Value") %>'>
            </asp:DropDownList>
        </div>
    </EditItemTemplate>
</asp:TemplateField>

UpdateMethod GridView имеет "Value" в качестве входного параметра, и он должен иметь возможность решить, брать ли его из DropDownListValue или TextBoxValue.

<asp:ObjectDataSource ID="ODSResults" runat="server" 
    SelectMethod="GetDataByIdDevice" 
    TypeName="DataSetSWCTableAdapters.DispositivoParametro_TableAdapter" 
    UpdateMethod="Save">
    <SelectParameters>
        <asp:QueryStringParameter Name="IdDevice" QueryStringField="id" Type="Int32" />
        <asp:ProfileParameter Name="Culture" PropertyName="Cultura" Type="String" />
        <asp:Parameter Name="ParameterCode" Type="String" />
    </SelectParameters>
    <UpdateParameters>
        <asp:Parameter Name="IdDevice" Type="Int32" />
        <asp:Parameter Name="IdParameter" Type="Int32" />
        <asp:Parameter Name="Value" Type="Int64" />
    </UpdateParameters>
</asp:ObjectDataSource>

Я пытался скрыть/показать элементы управления TextBoxValue и DropDownListValue (используя свойство «Visible»), но это не работает: пользовательский интерфейс в порядке, но UpdateMethod всегда получает 0 в качестве входного значения (я думаю, в результате приведения пустой строки).


person Matte    schedule 05.10.2012    source источник


Ответы (2)


Простое использование RowDatabound Event Gridview должно решить вашу проблему... см. приведенный ниже код...

 protected void GridView_RowDataBound(object sender, GridViewRowEventArgs e)
     {
         if (e.Row.RowType == DataControlRowType.DataRow)
         { 
            if( e.Row.RowState==DataControlRowState.Edit)
               {
                  DropDownList drpctrl =(DropDownList)e.Row.Cells[CellIndex].FindControl("DropDownListValue");
                  TextBox  txtCntrl=(TextBox )e.Row.Cells[CellIndex].FindControl("TextBoxValue");
                  if(YuorCondition)
                    {
                        drpctrl.Visible=true/false;
                        txtCntrl.Visible=true/false;

                        ODSResults.UpdateMethod = "Save";
                        ODSResults.InputParameters.Clear(); 
                        ODSResults.InputParameters.Add("IdDevice", "Value1");
                                  ODSResults.InputParameters.Add("IdParameter", "Value2");
                        ODSResults.InputParameters.Add("Value", dropdownValue/Textbox Value);
                    }
               }

         }
     }
person Amol Kolekar    schedule 05.10.2012
comment
Смотрите мой комментарий к ответу Навина - person Matte; 05.10.2012
comment
я не понял... о каком методе обновления вы говорите? - person Amol Kolekar; 05.10.2012
comment
Источник данных GridView имеет метод обновления. Одним из входных параметров метода обновления является значение. Я отредактировал свой пост, чтобы лучше объяснить эту часть. - person Matte; 05.10.2012
comment
извините за поздний ответ, я отредактировал ответ, пожалуйста, проверьте, работает ли он для вас... - person Amol Kolekar; 05.10.2012
comment
Ваше предложение меня почти устраивает. Я устанавливаю видимость в событии RowCreated и определение входных параметров DataSource (для UpdateMethod) в событии RowUpdating. Таким образом это работает. Спасибо! - person Matte; 08.10.2012

Попробуй это

Разметка

<asp:TextBox ID="TextBoxValue" runat="server" 
        Text='<%# Bind("Value") %>'
        Visible='<%# ShouldTextBoxBeVisible(Bind("Type")) %>'>
</asp:TextBox>
<asp:DropDownList ID="DropDownListValue" runat="server" 
        SelectedValue='<%# Bind("Value") %>'
        Visible='<%# ShouldDropDownBeVisible(Bind("Type")) %>'>
</asp:DropDownList>

Код программной части

protected bool ShouldTextBoxBeVisible(object objType)
{
    return (objType != null && objType.ToString() == "TextBoxVisibleType");
}
protected bool ShouldDropDownBeVisible(object objType)
{
    return (objType != null && objType.ToString() == "DropDownVisibleType");
}
person naveen    schedule 05.10.2012
comment
Пользовательский интерфейс в порядке, но UpdateMethod по-прежнему не знает, какой источник привязки является правильным. В моем конкретном случае UpdateMethod имеет целочисленный параметр, и его значение равно 0 (я предполагаю, что 0 происходит от приведения из пустой строки), когда обновление подтверждено. - person Matte; 05.10.2012