2012-02-06 3 views
0

Я слишком долго задерживался на этом, и мой Google-Fu меня не сбивает. Я новичок в C# и .Net, поэтому здесь я очень расстроен.Фильтрация GridView с выпадающими списками

Вот что я до сих пор:

метод называется GetData заполняет DataSet, то я создаю DataTable из этого.

Я привязываю DataTable к GridView, который затем сортируется. Таблица и сортировка работают нормально, но мне нужно иметь фильтрацию вниз на нескольких столбцах, но я не могу заставить ничего работать.

Мой ASP:

<asp:GridView id="gvEvaluator" Runat="server" Width="750" tooltip="Evaluator Status"  AutoGenerateColumns="False" 
EnableViewState="true" 
HeaderStyle-ForeColor="#000000" 
HeaderStyle-BackColor="#CCCCCC" 
FooterStyle-ForeColor="#000000" 
FooterStyle-BackColor="#CCCCCC" 
Font-Size="8pt" 
Font-Names="Verdana" 
CellSpacing="0" 
CellPadding="3" 
ShowFooter="true" 
AllowSorting="true" 
GridLines="Both" 
BorderColor="#ffffff" 
BackColor="#ffffff" 
ItemStyle-HorizontalAlign="Left" 
visible="true" 
AllowPaging="false" 
AllowCustomPaging="false" 
OnSorting="GridView_Sorting"> 

    <Columns> 
     <asp:TemplateField HeaderText="<strong>Term</strong>" 
      HeaderStyle-HorizontalAlign="Center" HeaderStyle-VerticalAlign="Bottom" 
      ItemStyle-HorizontalAlign="Center" ItemStyle-VerticalAlign="top" > 
       <HeaderTemplate> 
        <asp:DropDownList ID="ddlTerm" 
         runat="server" 
         visible="true" 
         OnSelectedIndexChanged="ddlTermChanged" 
         AutoPostBack="true" 
         DataSourceID="gvEvaluator"> 
        </asp:DropDownList> 
       </HeaderTemplate> 
     </asp:TemplateField> 
<asp:BoundField DataField="Dept" HeaderText="Dept" SortExpression="Dept></asp:BoundField> 
<asp:BoundField DataField="Course" HeaderText="Course" SortExpression="Course"></asp:BoundField> 
<asp:BoundField DataField="Section" HeaderText="Section"></asp:BoundField> 
<asp:BoundField DataField="Evaluator" HeaderText="Evaluator" SortExpression="Evaluator"></asp:BoundField> 
<asp:BoundField DataField="Type" HeaderText="Evaluator Type"></asp:BoundField> 
<asp:BoundField DataField="Email_Address" Visible="false"></asp:BoundField> 
<asp:BoundField DataField="Days_Since_Login" HeaderText="Days Since Login"></asp:BoundField> 
<asp:BoundField DataField="Required_Work" HeaderText="Required Work" SortExpression="Required_Work"></asp:BoundField> 
<asp:BoundField DataField="Total_Assigned" HeaderText="Total Assigned" HeaderStyle-HorizontalAlign="Right" ItemStyle-HorizontalAlign="Right"></asp:BoundField> 
<asp:BoundField DataField="Total_Not_Started" HeaderText="Total Not Started" HeaderStyle-HorizontalAlign="Right" ItemStyle-HorizontalAlign="Right"></asp:BoundField> 
<asp:BoundField DataField="Total_in_Progress" HeaderText="Total in Progress" HeaderStyle-HorizontalAlign="Right" ItemStyle-HorizontalAlign="Right"></asp:BoundField> 
<asp:BoundField DataField="Total_Complete" HeaderText="Total Complete" HeaderStyle-HorizontalAlign="Right" ItemStyle-HorizontalAlign="Right"></asp:BoundField> 
<asp:BoundField DataField="eval_id" Visible="false"></asp:BoundField> 
<asp:TemplateField HeaderText="<strong>Need Reminder<strong>" ItemStyle-Width="250px"> 
        <ItemTemplate> 
        <label for="hyplEvaluator" class="hide">Email Evaluator</label> 
        <asp:HyperLink ID="hyplEvaluator" runat="server" CssClass="BodyLink" Text='<%# DataBinder.Eval(Container, "DataItem.Need_Reminder")%>' NavigateUrl='' /> 
        </ItemTemplate> 
        </asp:TemplateField> 
</Columns> 
</asp:GridView> 

И мой C#:

protected void getEvaluatorStatus() 
    { 
     try 
     { 
      ds = GetData(); 
      DataTable myTable = ds.Tables[0]; 
      if (myTable.Rows.Count != 0) 
      { 
       gvEvaluator.DataSource = ds; 
       gvEvaluator.DataBind(); 
       gvEvaluator.Visible = true; 
       lblNoAssignment.Visible = false; 
      } 
      else 
      { 
       lblNoAssignment.Visible = true; 
       gvEvaluator.Visible = false; 
      } 

      //Adds attributes to hyplEmailContact 

      for (int i = 0; i < gvEvaluator.Rows.Count; i++) 
      { 
       string inSenderID = Convert.ToString(meth.decrypt(Session["UserID"].ToString(), Convert.ToString(Session["University"]), Convert.ToString(Session["Department"]))); 
       string inRecptID = Convert.ToString(gvEvaluator.Rows[i].Cells[10].Text); 

       //custom string of attributes above 
       string customStr = "inSenderID=" + inSenderID + ",inRecptID=" + inRecptID; 

       //Adds the NavigateURL for Contact command to pass variables/attributes 
       HyperLink hyplEmailContact = (HyperLink)gvEvaluator.Rows[i].FindControl("hyplEvaluator"); 
       hyplEmailContact.NavigateUrl = "javascript:openEmailGeneral(" + customStr + ")"; 

      } //End for loop 

     } 
     catch (Exception ex) 
     { 
      Session["Error_Code"] = ex; 
      Response.Redirect("../Error.aspx"); 
     } 

Я просто смирен ошибка Squasher, поэтому единственный код, который я лично написал создавал GridView (из DataGrid) , метод GetData, делая его сортируемым и делая данные экспортируемыми.

+0

Это может помочь, если вы разместили образец кода и разметку. –

+1

, вероятно, было бы легче, если бы вы вставили свой код и шаблон разметки, соответствующий GridView. – MethodMan

ответ

1

Что-то, как это должно работать:

  1. Ручка ddlTermChanged измененное событие:
  2. Grab новое выбранное значение в списке, как так

    protected void ddlTermChanged(Object sender, EventArgs e) { 
        var newValue = ddlTerm.SelectedValue; 
        //see step 3 below 
    } 
    
  3. Теперь фильтровать данные и перевяжите его к Gridview; что-то вроде:

    protected void ddlTermChanged(Object sender, EventArgs e) { 
        var newValue = ddlTerm.SelectedValue; 
        DataTable t= GetDataByID(newValue); 
        gvEvaluator.DataSource=t; 
        gvEvaluator.DataBind(); 
    } 
    

На отдельной ноте, все преобразования вы делаете на Gridview внутри метода getEvaluatorStatus должны были обработаны в OnRowDataBound случае. Выполняя это так, как вы это делали, каждый раз, когда вы перепровергаете данные (как в случае фильтрации), вам нужно будет повторить код внутри getEvaluatorStatus, чтобы сделать преобразования снова. Если вы сделаете это OnRowDataBound, вам не придется повторять код, поскольку событие поднимается для каждой строки, поскольку оно связано.

+0

Хорошо, это указывает на меня в правильном направлении, но вызывает проблему, с которой я столкнулся: каждый выпадающий список? Я попытался сделать это с помощью метода ddlPopulateTerm, связанного с ним datatable, затем сделав что-то вроде: ddlTerm.DataTextField = ds.Tables [0] .Columns [0] .ToString(); Но это не работает И спасибо! – user1036322

Смежные вопросы