我有一个现成的库(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
我认为现在我的问题很清楚了。 我怎样才能实现这一目标? 提前致谢
答案 0 :(得分:1)
因此,您希望按用户点击的单元格值过滤GridView的DataSource
。这些是多个任务,我将尝试解释所有。
主要任务是启用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;
}
}
}
正如您所看到的,我已将clientide onclick
事件添加到每个单元格。我使用隐藏的TextBox
(display:none)和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>
答案 1 :(得分: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" />
现在将呈现一个超链接,单击该超链接将在新页面中打开详细信息。