因此,您想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>