Понимание ObjectDataSource и параметров выбора - PullRequest
5 голосов
/ 06 августа 2009

У меня в 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>

мой класс OperatorFieldsDAO:

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 «Тип».

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

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

Ответы [ 3 ]

4 голосов
/ 07 августа 2009

, чтобы получить эту работу, я добавляю, чтобы создать два метода (один для GridView и другой для ObjectDataSource), а также изменить параметр выбора из 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>

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

1 голос
/ 06 августа 2009

Так как у вас есть:

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

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

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

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

0 голосов
/ 12 мая 2012

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

...