これは非常に乱雑です。
ここは非常にシンプルで洗練されたソリューションです。グリッドが3列の表にデータを表示する必要があるとします。データは以下の構造を持つオブジェクトから来ている:
マークアップ(GridDisplayRow.ascx):
[Serializable]
public class Foo
{
public string Bar1 { get; set; }
public string Bar2 { get; set; }
public string Bar3 { get; set; }
}
は、その後、あなたのユーザーコントロールは、次のマークアップを持っています
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="GridDisplayRow.ascx.cs" Inherits="GridDisplayRow" %>
<div>
<div class="cell">
<asp:TextBox id="TxtProperty1" runat="server"/>
</div>
<div class="cell">
<asp:DropDownList ID="DDLProperty2" runat="server" OnSelectedIndexChanged="DDLProperty2_OnSelectedIndexChanged" AutoPostBack="true">
</asp:DropDownList>
</div>
<div class="cell">
<input type="radio" id="RadProperty3" runat="server">
</div>
</div>
お知らせすべてdivタグ。子供たちのdivは浮かんでいるので、並べて表示されます。
分離コード(GridDisplayRow.ascx.cs):
class GridDisplayRow:UserControl
{
public event EventHandler<System.EventArgs> SomethingHappened;
protected void Page_Load(object sender, EventArgs e)
{
//Initialize the drop down with something;
}
//this is where we handle internal events generated by children controls.
//Eg: the drop down's index changed.
protected void DDLProperty2_OnSelectedIndexChanged(object sender, EventArgs e)
{
//we update some other child control in this...
this.TxtProperty1.Text = this.DDLProperty2.Value;
//and maybe we want to signal the page that some event happened
if(SomethingHappened != null)
{
//Notify the page that SomethingHappened event occured
SomethingHappened(this, EventArgs.Empty);
}
}
//This is where the binding happens
public object BindingObject
{
set
{
Foo temp = (Foo)value;
this.TxtProperty1.Text = temp.Bar1;
this.DDLProperty2.Value = temp.Bar2;
this.RadProperty3.Value = temp.Bar3;
this.ViewState["Foo"] = temp;
}
}
}
だから我々は、fooへの結合を処理している上記のコードでは、他の言葉で我々がコントロールの(DIV)、各セル内のFooのプロパティを表示しています。上記のプロパティがオブジェクト型で、Grid/Repeater/WhatのItemTemplateにGridDisplayRowのインスタンスをContainer.DataItemオブジェクトにバインドするため、以下のようにキャストが必要です。
ページマークアップ:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Test.aspx.cs" Inherits="Test" %>
<%@ Register src="GridDisplayRow.ascx" tagname="GridRow" tagprefix="ctrl" %>
<asp:GridView ID="GridView1" runat="server">
<Columns>
<asp:TemplateField>
<HeaderTemplate>
<div>
<div class="header cell">Header 1</div>
<div class="header cell">Header 2</div>
<div class="header cell">Header 3</div>
</div>
</HeaderTemplate>
<ItemTemplate>
<ctrl:GridRow ID="Row" runat="server" BindingObject='<%# Container.DataItem %>' OnSomethingHappened="Row_SomethingHappened" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
を私が働いて好きではないだけで、あなたのデータソースは、例えばデータセットであれば、あなたがたDataRowにキャストする必要がある、または任意の適切なデータ型が必要であることに注意してくださいそれらは面倒で扱いにくいので、グリッドを使用してください。この例では、グリッドをトリックして1行に1つのセルを持つテーブルを作成し、そのセル内のレイアウトをスタイルシートで処理しました。
これは超効率的でオーバーヘッドが少ないため、リピータの方が効果的です。
グリッドをバインドする: IEnumerableを実装するすべてのソースを使用して、グリッドにバインドできます。 Listなどのコレクションで十分です。
GridRowコントロールがイベントを発生させると、コントロール自体への参照がオブジェクト送信者経由で送信されるため、送信者を正しいタイプにキャストすると、コントロールの内部プロパティを取得することができます。
このような方法の利点は、抽象化です。各コントロールは、独自のイベントを処理することができますか、または内部で発生したイベントのページに通知することを選択しました.... bla bla bla。あなたはその考えを得る。