私は通常Repeater
、asp.netページでテーブルを生成するために処理しますが、テーブルで動的列を処理する必要があるため、Webコントロールを使用してこの問題を解決する一般的なアプローチがあるかどうか疑問に思います。
私は使用GridView
したことがないので、これが動的列を持つテーブルをレンダリングするのに適しているかどうかわかりませんか?より適切なアプローチを教えていただけますか?を使用してこれを達成する方法はありRepeater
ますか?
AutoGenerateColumnsを true に設定するGridView
こともできます。列を検査して追加しますDataSource
<asp:sqldatasource id="CustomersSource"
selectcommand="SELECT CustomerID, CompanyName, FirstName, LastName FROM SalesLT.Customer"
connectionstring="<%$ ConnectionStrings:AWLTConnectionString %>"
runat="server"/>
<asp:gridview id="CustomersGridView"
datasourceid="CustomersSource"
autogeneratecolumns="True"
emptydatatext="No data available."
allowpaging="True"
runat="server" DataKeyNames="CustomerID">
</asp:gridview>
その状況にどのように対処したいかを知ることは非常に重要です。
状況 1: 既存のテーブルがあり、時々列を追加する場合 (これはあまり実用的ではありません)、すぐに GridView に移動し、AutoGenerateColumns バインド プロパティを true に設定できます。
状況 2
テーブルを処理する独自の HTmlHelper クラスを作成できます。これについては、次の投稿にアクセスできます。
オブジェクトのリストから MVC HtmlHelper テーブルを作成する方法
MVC を使用している場合。
使用する必要がある場合は、これを行うための簡単なハックを次に示しますRepeater
。
.aspx で:
<asp:Repeater ID='rptr' runat='server'> <ヘッダー テンプレート> <テーブル> <スレッド> <tr> <番目> 常に表示されるヘッダー列 </th> <th id='thHidable' runat='server' class='hideable'> 非表示可能なヘッダー列 </th> </tr> </スレッド> <本体> </HeaderTemplate> <アイテムテンプレート> <tr> <td> 繰り返される列 </td> <td id='tdHideable' runat='server' class='hideable'> 非表示可能な繰り返し列 </td> </tr> </ItemTemplate> <フッターテンプレート> </tbody></table> </FooterTemplate> </asp:リピーター>
コードビハインド (C# が使用されていると仮定):
protected override void Page_Init()
{
this.rptr.ItemDataBound += new RepeaterItemEventHandler(rptr_ItemDataBound);
}
void rptr_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
RepeaterItem item = (RepeaterItem)e.Item;
if (item.ItemType == ListItemType.Header)
{
HtmlTableCell thHidable = (HtmlTableCell)item.FindControl("thHidable");
if (hideCondition)
{
// thHidable.Visible = false; // do not render, not usable by client script (use this approach to prevent data from being sent to client)
thHidable.Style["display"] = "none"; // rendered hidden, can be dynamically shown/hidden by client script
}
}
else if (item.ItemType == ListItemType.Item || item.ItemType == ListItemType.AlternatingItem)
{
HtmlTableCell tdHideable = (HtmlTableCell)item.FindControl("tdHideable");
if (hideCondition)
{
// tdHideable.Visible = false; // do not render, not usable by client script (use this approach to prevent data from being sent to client)
tdHideable.Style["display"] = "none"; // rendered hidden, can be dynamically shown/hidden by client script
}
}
}
(省略可能)クライアント側で列を動的に表示する場合 (レンダリングされたと仮定)、jQuery を使用して (簡潔にするため):
$(".hideable").show();