سؤال

لدي في 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>

لدي قطرة أرغب في ملء من outemndatasource، ولكن لكل سطر أرغب في اجتياز معلمة مختارة لذلك يملأ بالقيم الصحيحة

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

فئة OperatorViLesDao هي:

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

كل هذا لإخبارك بأنني أحصل على خطأ:

لا يمكن العثور على التحكم "HFFEIDTYPE" في ControlParameter "النوع".

ما الخطأ الذي افعله؟

هل أحتاج إلى تمرير هذه المعلمة المحددة باستخدام onrowdatabound. طريقة؟

هل كانت مفيدة؟

المحلول

للحصول على هذا العمل، أضيف لإنشاء طريقتين (واحد لشبكة GridView وغيرها من ObjectDataSource)، وكذلك تغيير المعلمة المحددة من عنصر تحكم إلى معلمة عادية.

هذه الفكرة هي تعيين المعلمة في كل مرة يكون الصف الذي تم إنشاؤه ...

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 = "";

وكانت enjobsdatasource سيكون

<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 في غضون بضع سنوات، لكنني أظن أنك قد ترغب في ربط اختيار. حدث.

UnjectDataSource لا يمكن العثور على عنصر التحكم المستخدم للإدخال إلا إذا كان ذلك قريبا في العلامة. يجب أن تكون DataSource داخل العلامة التي تحتوي على عنصر التحكم المستخدم للإدخال. يبدو أن مشكلة النحافة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top