ObjectDatasource 이해 및 매개 변수를 선택하십시오
-
11-09-2019 - |
문제
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는 마크 업에 가까워지지 않는 한 입력에 사용되는 컨트롤을 찾을 수 없습니다. 데이터 소스는 입력에 사용 된 컨트롤이 포함 된 태그 내부에 있어야합니다. 그것은 범죄 문제 인 것 같습니다.