3

我有一个现成的库(dll)给我,其中包含重要数据,我能够将这些数据放入Datatable并成功显示在GridView.

现在我的进一步任务是它显示的数据GridView应该是可过滤的,这意味着如果我单击一行上的任何列,它应该过滤相似列的结果。

这是我的 GridView 结果

HeaderCol1        HeaderCol2       HeaderCol3      HeaderCol4 
Name1              Info1            ID1              Time1
Name2              Info2            ID2              Time2
Name1              Info3            ID3              Time3
Name3              Info2            ID4              Time4
Name4              Info4            ID3              Time5
Name5              Info5            ID5              Time5

现在我想要的是如果我点击 Name1 它应该显示

HeaderCol1        HeaderCol2       HeaderCol3      HeaderCol4 
Name1              Info1            ID1              Time1
Name1              Info3            ID3              Time3

如果我点击 Info2 它应该显示

HeaderCol1        HeaderCol2       HeaderCol3      HeaderCol4 
Name2              Info2            ID2              Time2
Name3              Info2            ID4              Time4

我想我的问题现在很清楚了。我怎样才能做到这一点?提前致谢

4

2 回答 2

1

因此,您想DataSource通过用户单击的单元格的值来过滤 GridView。这些是一项多项任务,我将尝试解释所有任务。

主要任务是使每个单元格GridView对用户的点击做出反应,在服务器端处理该点击事件并以某种方式从该单元格获取值。

DataTable在以下示例中使用了一个,将其替换为您的数据源类型。如果您需要将自定义事件/控件添加到GridViewRows最佳位置,RowCreated因为这会在每次回发时调用,而不仅仅是在数据绑定上。请注意,您DataItem在此阶段没有。

protected void gridView1_RowCreated(Object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        for(int i = 0; i < e.Row.Cells.Count; i++)
        {
            TableCell cell = e.Row.Cells[i];
            cell.ToolTip = "Click to filter by this value";
            string js = string.Format("var txt=document.getElementById('{0}');txt.value='{1} {2}';{3}"
                , TxtFilter.ClientID, e.Row.RowIndex, i
                , ClientScript.GetPostBackClientHyperlink(TxtFilter, null));
            cell.Attributes["onclick"] = js;
        }
    }
}

如您所见,我已将客户端onclick事件添加到每个单元格。我正在使用隐藏的TextBox(显示:无)AutoPostBack=true来存储用户单击的行和单元格。现在您可以在服务器端处理和处理 click 事件。

protected void FilterGrid(object sender, EventArgs e)
{
    TextBox txtFilter = (TextBox)sender;
    string[] parts = txtFilter.Text.Split();
    int row = int.Parse(parts[0]);
    int col = int.Parse(parts[1]);
    gridView1.DataSource = GetData(row, col);
    gridView1.DataBind();
}

// replace with your DAL, used a DataTable for testing
private DataTable GetData(int rowIndex = -1, int colIndex = -1)
{
    DataTable tblData = getDataSource(); 
    if (rowIndex > -1 && colIndex > -1)
    {
        var field = tblData.Columns[colIndex];
        var row = tblData.Rows[rowIndex];
        var value = row[field];
        // now use Linq-To-DataSet to filter the table, remember to add 'using System.Linq'
        tblData = tblData.AsEnumerable()
            .Where(r => !r.IsNull(field) && r[field].Equals(value))
            .CopyToDataTable();
    }

    return tblData;
}

这是我的示例页面的 aspx:

<asp:TextBox ID="TxtFilter" runat="server" style="display:none" AutoPostBack="true" OnTextChanged="FilterGrid" />
<asp:GridView ID="gridView1" runat="server" AutoGenerateColumns="False" OnRowCreated="gridView1_RowCreated"  >
   <Columns>
       <asp:TemplateField HeaderText="HeaderCol1">
            <ItemTemplate>
                <asp:Label ID="LblHeaderCol1" runat="server" Text='<%#Eval("HeaderCol1") %>' />
            </ItemTemplate>
       </asp:TemplateField>
       <asp:TemplateField HeaderText="HeaderCol2">
            <ItemTemplate>
                <asp:Label ID="LblHeaderCol2" runat="server" Text='<%#Eval("HeaderCol2") %>' />
            </ItemTemplate>
       </asp:TemplateField>
       <asp:TemplateField HeaderText="HeaderCol3">
            <ItemTemplate>
                <asp:Label ID="LblHeaderCol3" runat="server" Text='<%#Eval("HeaderCol3") %>' />
            </ItemTemplate>
       </asp:TemplateField>
       <asp:TemplateField HeaderText="HeaderCol4">
            <ItemTemplate>
                <asp:Label ID="LblHeaderCol4" runat="server" Text='<%#Eval("HeaderCol4") %>' />
            </ItemTemplate>
       </asp:TemplateField>
  </Columns>
</asp:GridView>
于 2012-11-09T13:07:42.050 回答
0

1) 创建显示人员详细信息的新页面(.aspx 文件)等。

2)在您当前GridView,您必须使用HyperLinkField而不是简单BoundField

      <asp:hyperlinkfield datatextfield="UnitPrice"
        datatextformatstring="{0:c}"
        datanavigateurlfields="ProductID"
        datanavigateurlformatstring="~\yourNewPage.aspx?ProductID={0}"          
        headertext="HeaderCol1"
        target="_blank" />

现在,这将呈现一个超链接,单击该超链接将在新页面中打开详细信息。

于 2012-11-08T12:35:59.080 回答