Вопрос

У меня есть элемент управления GridView TemplateField, например:

<asp:TemplateField ItemStyle-Width="150px">
   <ItemTemplate>
      <asp:DropDownList ID="ddlFields" runat="server" DataSourceID="odsOperator" DataTextField="Text" DataValueField="Value" />
      <asp:HiddenField ID="hfFieldType" runat="server" Value='<%# Eval("FieldType")%>' />
   </ItemTemplate>
</asp:TemplateField>

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

<asp:ObjectDataSource ID="odsOperator" runat="server" TypeName="OperatorFieldsDAO"
   SelectMethod="FindByType">      
   <SelectParameters>
      <asp:ControlParameter ControlID="hfFieldType" Type="String" Name="Type" PropertyName="Value" />
   </SelectParameters>
</asp:ObjectDataSource>

мой класс OperationFieldsDAO:

public class OperatorFieldsDAO
{
    private List<OperatorField> OperatorFields
    {
        get
        {
            List<OperatorField> operatorFields = HttpContext.Current.Session["OperatorFields"] as List<OperatorField>;
            if (operatorFields == null)
            {
                operatorFields = new List<OperatorField>();
                operatorFields.Add(new OperatorField("string", "contains", "C"));
                operatorFields.Add(new OperatorField("string", "begins with", "BW"));
                operatorFields.Add(new OperatorField("string", "is equal to", "E"));
                operatorFields.Add(new OperatorField("string", "is not equal to", "NE"));
                operatorFields.Add(new OperatorField("string", "is less than", "L"));
                operatorFields.Add(new OperatorField("string", "is greater than", "G"));
                operatorFields.Add(new OperatorField("string", "is less than or equal to", "LE"));
                operatorFields.Add(new OperatorField("string", "is greater than or equal to", "GE"));
                operatorFields.Add(new OperatorField("string", "is from", "F"));
                operatorFields.Add(new OperatorField("string", "is between", "B"));
                operatorFields.Add(new OperatorField("string", "is nothing", "N"));
                operatorFields.Add(new OperatorField("string", "is something", "S"));

                operatorFields.Add(new OperatorField("number", "is the same as", "S"));
                operatorFields.Add(new OperatorField("number", "is not the same as", "S"));
                operatorFields.Add(new OperatorField("number", "is one of", "S"));
                operatorFields.Add(new OperatorField("number", "is not one of", "S"));
                operatorFields.Add(new OperatorField("number", "is nothing", "N"));
                operatorFields.Add(new OperatorField("number", "is something", "S"));
            }
            return operatorFields;
        }
    }
    public OperatorFieldsDAO() { }

    [DataObjectMethod(DataObjectMethodType.Select)]
    public IEnumerable<OperatorField> FindAll()
    {
        return this.OperatorFields;
    }

    [DataObjectMethod(DataObjectMethodType.Select)]
    public IEnumerable<OperatorField> FindByType(String type)
    {    
        List<OperatorField> r = new List<OperatorField>();

        foreach (OperatorField f in this.OperatorFields)
            if (f.Type == type)
                r.Add(f);

        return r;
    }
}

все это для того, чтобы сказать вам, что я получаю сообщение об ошибке:

Не удалось найти элемент управления «hfFieldType» в ControlParameter «Тип».

Что я делаю не так?

Нужно ли мне программно передать этот выбранный параметр, используя Онровдатабаунд метод?

Это было полезно?

Решение

чтобы это заработало, я добавляю создание двух методов (один для GridView и другой для ObjectDataSource), а также меняю параметр Select с ControlParameter на обычный параметр.

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

protected void gvSearch_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        DropDownList d = (DropDownList)e.Row.FindControl("ddlFields");
        string type = ((HiddenField)e.Row.FindControl("hfFieldType")).Value;

        _type = type;
        d.DataBind();
    }
}
protected void odsOperator_Selecting(object sender, ObjectDataSourceSelectingEventArgs e)
{
    e.InputParameters["Type"] = _type;
}

private string _type = "";

и ObjectDataSource будет

<asp:ObjectDataSource ID="odsOperator" runat="server" TypeName="OperatorFieldsDAO"
   SelectMethod="FindByType" onselecting="odsOperator_Selecting">
   <SelectParameters>
      <asp:Parameter Type="String" Name="Type" />
   </SelectParameters>
</asp:ObjectDataSource>

Надеюсь, это кому-нибудь поможет...

Другие советы

Поскольку у вас есть:

<asp:HiddenField ID="hfFieldType" runat="server" .../>

В течение TemplateField на ваш взгляд, на странице может отсутствовать одно или несколько экземпляров этого поля.Поэтому hfFieldType не будет уникальным идентификатором, фактически фактический идентификатор будет определен во время выполнения.

Таким образом, ваш параметр управления не может его найти, поскольку он ищет его значение в свойстве элемента управления, называемом hfFieldType где-то на странице.

Я не работал с ObjectDataSource несколько лет, но подозреваю, что вы, возможно, захотите подключиться к Выбор событие.

ObjectDataSource не может найти элемент управления, используемый для ввода, если он не находится рядом в разметке.Источник данных должен находиться ВНУТРИ тега, содержащего элемент управления, используемый для ввода.Похоже, это проблема с областью охвата.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top