0

私は DataSource Filtering を調べていましたが、ページ アプリの複雑さにより、ロジックが泥の中を進んでいます。

データソースから 3/17 の値を表示する Gridview があります。データソースに対して 3 つのドロップダウンと 3 つのチェックボックスでフィルターを実行したいと考えています。3 つの DDL には、インデックス 0 で String.Empty のデフォルト値があり、ページの読み込み時に別の DS によって入力されます (!IsPostBack)。

私の問題:

  • ページが読み込まれると、グリッドビューには何もありません。空の DDL 値はスキップする必要があります。
  • 最後のチェック ボックスは、(Part_Catalog.PartCount > 0)かどうかを表す必要があります。
  • 現在、フィルターはデータソースで定義されていますが、上記の条件により、cs ファイルで何らかの処理を行う必要があります。私が確信していないのは、DS 全体を分離コード、フィルター、またはフィルター条件だけに移動する必要があるかどうかです。
  • また、どのイベントに配線すればよいかわかりません。

    <asp:SqlDataSource ID="SqlDataSource1" 
         runat="server" 
         EnableCaching="true"
         DataSourceMode="DataSet"
         ConnectionString="<%$ ConnectionStrings:inventory_v2ConnectionString %>" 
                     SelectCommand="SELECT ID, OEMPartCode, PartCode2, UsedByOEM, ItemType, GroupType, PartCount, PartDesc, PartComment, PartMin, PartActive, MFRPartNumber, PartCapacity, PreTurnRequired, AssemblyPart, PartImage, PartImage2, NonInventoryPart FROM dbo.Part_Catalog"
                     FilterExpression="UsedByOEM = '{0}' AND ItemType = '{1}' AND GroupType = '{2}' OR     (UsedByOEM = '{0}' OR ItemType = '{1}' OR GroupType = '{2}') OR (UsedByOEM = '{0}' OR     ItemType = '{1}' AND GroupType = '{2}') OR (UsedByOEM = '{0}' AND ItemType = '{1}' OR     GroupType = '{2}')">
        <FilterParameters>
        <asp:ControlParameter Name="UsedByOEM" ControlID="DDL_OEM" PropertyName="SelectedValue" />
        <asp:ControlParameter Name="ItemType" ControlID="DDL_ItemTypes" PropertyName="SelectedValue" />
        <asp:ControlParameter Name="GroupType" ControlID="DDL_GroupTypes" PropertyName="SelectedValue" />
        </FilterParameters>    
    </asp:SqlDataSource>
    
    
      <asp:DropDownList ID="DDL_OEM" runat="server" AutoPostBack="True" AppendDataBoundItems="True"></asp:DropDownList>
       <asp:DropDownList ID="DDL_ItemTypes" runat="server" AutoPostBack="True" AppendDataBoundItems="True"></asp:DropDownList>   
       <asp:DropDownList ID="DDL_GroupTypes" runat="server"   AutoPostBack="True" AppendDataBoundItems="True"></asp:DropDownList>      
       <asp:CheckBox ID="CheckBox1" runat="server" Checked="True" />
       <asp:CheckBox ID="CheckBox2" runat="server" />
       <asp:CheckBox ID="CheckBox3" runat="server" Checked="True" />
    
    protected void BindOEMs()
    {
        SqlConnection connectionString = new SqlConnection(ConfigurationManager.ConnectionStrings["inventory_v2ConnectionString"].ConnectionString);
        connectionString.Open();
        SqlCommand cmd = new SqlCommand("SELECT [Manufacturer], [ID] FROM [Models_OEMs] ORDER BY [Manufacturer]", connectionString);
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        DataSet ds = new DataSet();
        da.Fill(ds);
        connectionString.Close();
        DDL_OEM.DataSource = ds;
        DDL_OEM.DataTextField = "Manufacturer";
        DDL_OEM.DataValueField = "ID";
        DDL_OEM.DataBind();
        DDL_OEM.Items.Insert(0, new ListItem(String.Empty, "0"));
    }            
    
4

1 に答える 1

0

今それを考え出した。以下の行を page_load (!isPostBack) に追加して、最初の読み込み時にフィルターが適用されるようにしました。

if (gvFilter.OEM == null || gvFilter.OEM == 0 ) { Filter_DataSet(null, null); }

私のカテゴリでカスタム Filter オブジェクトを作成しました:

 public class Filters
{
    private int oem;
    private int item;
    private int group;
    private bool active;
    private bool ninventoried;
    private bool stocked;

    public int OEM
    {
        set { oem = value; }
        get { return oem; }
    }
    public int Item
    {
        set { item = value; }
        get { return item; }
    }
    public int Group
    {
        set { group = value; }
        get { return group; }
    }
    public bool Active
    {
        set { active = value; }
        get { return active; }
    }
    public bool Ninventoried
    {
        set { ninventoried = value; }
        get { return ninventoried; }
    }
    public bool Stocked
    {
        set { stocked = value; }
        get { return stocked; }
    }

}

次に、フィルターをデータソースに適用するメソッドを作成し、すべてのフィルター コントロール イベントをこのメソッドに設定します。

protected void Filter_DataSet(object sender, EventArgs e)
{
    DetailsView1.Visible = false;
    string FEString= String.Empty;
    gvFilter.OEM = Convert.ToInt32(DDL_OEM.SelectedValue);
    gvFilter.Item = Convert.ToInt32(DDL_ItemTypes.SelectedValue);
    gvFilter.Group = Convert.ToInt32(DDL_GroupTypes.SelectedValue);
    if (CheckBox1.Checked == true) { gvFilter.Active = true; } else { gvFilter.Active = false; }
    if (CheckBox2.Checked == true) { gvFilter.Ninventoried = true; } else { gvFilter.Ninventoried = false; }
    if (CheckBox3.Checked == true) { gvFilter.Stocked = true; } else { gvFilter.Stocked = false; }

    if (gvFilter.OEM >0)
    {
        FEString += "UsedByOEM = " + gvFilter.OEM.ToString(); 
    }
    if (gvFilter.Item > 0)
    {
        if (FEString.Length > 0) { FEString += " AND "; }
        FEString += "ItemType = " + gvFilter.Item.ToString();
    }
    if (gvFilter.Group > 0)
    {
        if (FEString.Length > 0) { FEString += " AND "; }
        FEString += "GroupType = " + gvFilter.Group.ToString();
    }
    if (gvFilter.Active == true)
    {
        if (FEString.Length > 0) { FEString += " AND "; }
        FEString += "PartActive = " + gvFilter.Active.ToString();
    }
    if (gvFilter.Active == false)
    {
        if (FEString.Length > 0) { FEString += " AND "; }
        FEString += "PartActive = " + gvFilter.Active.ToString();
    }
    if (gvFilter.Ninventoried == true)
    {
        if (FEString.Length > 0) { FEString += " AND "; }
        FEString += "NonInventoryPart = " + gvFilter.Ninventoried.ToString();
    }
    if (gvFilter.Ninventoried == false)
    {
        if (FEString.Length > 0) { FEString += " AND "; }
        FEString += "NonInventoryPart = " + gvFilter.Ninventoried.ToString();
    }
    if (gvFilter.Stocked == true)
    {
        if (FEString.Length > 0) { FEString += " AND "; }
        FEString += "PartCount > 0 ";
    }
    //if (gvFilter.Stocked == false)
    //{
    //    if (FEString.Length > 0) { FEString += " AND "; }
    //    FEString += "PartCount <= 0 ";
    //}
    SqlDataSource1.FilterExpression = FEString;
}
于 2013-05-24T18:15:31.657 に答える