DataSource
したがって、ユーザーがクリックしたセルの値でGridViewをフィルタリングする必要があります。これらは1つに複数のタスクがあるので、すべてを説明しようと思います。
主なタスクは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
(display:none)をAutoPostBack=true
使用して、ユーザーがクリックした行とセルを保存しています。これで、サーバー側でクリックイベントを処理および処理できるようになりました。
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>