문제

GridView Control에는 다음과 같은 템플릿 필드가 있습니다.

<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;
    }
}

이 모든 것이 내가 오류가 발생한다고 말하기 위해 다음과 같습니다.

ControlParameter '유형'에서 'hffieldtype'를 찾을 수 없습니다.

내가 뭘 잘못하고 있죠?

선택한 매개 변수를 사용하여 프로그램적으로 전달해야합니까? onrowdatabound 방법?

도움이 되었습니까?

해결책

이 작업을 수행하기 위해 두 가지 메소드 (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>

나는 그것이 누군가를 돕기를 바랍니다 ...

다른 팁

당신은 가지고 있기 때문에 :

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

이내에 TemplateField 당신의 견해 중에서, 페이지에 해당 필드의 하나 또는 많은 사례가 없을 수 있습니다. 그러므로 hfFieldType 고유 한 ID는 아니며 실제로 실제 ID는 런타임에 결정됩니다.

따라서 컨트롤 매개 변수는 호출되는 컨트롤 속성에서 그 값을 찾고 있기 때문에 그것을 찾을 수 없습니다. hfFieldType 페이지 어딘가.

나는 몇 년 동안 ObjectDatasource와 함께 일하지 않았지만 당신이 선택 이벤트.

ObjectDatasource는 마크 업에 가까워지지 않는 한 입력에 사용되는 컨트롤을 찾을 수 없습니다. 데이터 소스는 입력에 사용 된 컨트롤이 포함 된 태그 내부에 있어야합니다. 그것은 범죄 문제 인 것 같습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top