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をフィルタリングする必要があります。これらは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>
于 2012-11-09T13:07:42.050 に答える
0

1)人物の詳細などを表示する新しいページ(.aspxファイル)を作成します。

2)あなたの現在では、単純な代わりにGridView使用する必要があります:HyperLinkFieldBoundField

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

これによりハイパーリンクがレンダリングされ、クリックすると新しいページで詳細が開きます。

于 2012-11-08T12:35:59.080 に答える