4

データバインドされたasp:repeaterコントロールのフィールドの変更時にサブヘッダー行を表示する方法はありますか?

それ以外の

国 | 色 | 番号
イギリス | 赤 | 赤 | 3
イギリス | 緑 | 3
フランス | フランス | 赤 3

これを行う:

==イギリス==
色 | 番号
赤 | 赤 | 3
緑 3
==フランス==
色 | 番号
赤 | 赤 | 3

助けてくれてありがとう。

4

5 に答える 5

5

組み込みのサポートはありませんが、それが不可能というわけではありません。

OnItemDataBound イベントをオーバーライドし、マークアップに次のようなものを含める必要があります。

<asp:Repeater OnItemDataBound="NextItem" ... >
    <ItemTemplate><asp:Literal Id="Header" Visible="False" Text="{0}<strong>{1}</strong><br/><table>" ... />
         <tr>
             <td><asp:Label id="Color" Text="<%# Eval("Color")" ... /></td>
             <td><asp:Label id="Number" Text="<%# Eval("Number")" ... /></td>
         </tr>
    </ItemTemplate>
</asp:Repeater></table>

次に、コード ビハインドで:

private string CurCountry = string.Empty;

private void NextItem(object sender, RepeaterItemEventARgs e)
{
    if ( e.Item.ItemType != ListItemType.Item 
      && e.Item.ItemType != ListItemType.AlternatingItem) return;

    DbDataRecord row = (DbDataRecord)e.Item.DataItem;

    if (CurCountry != row["country"].ToString() )
    {
        string prev = (CurCounter == string.Empty)?"":"</table>";
        CurCountry = row["country"].ToString();

        Literal header = (Literal)e.Item.FindControl("Header");
        Literal footer = (Literal)e.Item.FindControl("Footer");

        header.Text = string.Format(header.Text, prev, CurCountry);
        header.Visible = true;
    }
}
于 2009-02-03T14:31:26.967 に答える
3

もう 1 つの解決策は、単純に 2 つのリピータを使用して、一方を他方の中に入れ子にすることです。子レコードを含むグループを最初のリピーターに渡し、グループ リピーターの ItemDataBound で、子レコードを子リピーターに渡し、そこで DataBind() を呼び出します。

これはより多くのコードですが、コード ビハインドに HTML 作成コードを含めなくても、実際にはレイアウトをより詳細に制御できます。

ここでわかるように、親リピーターがあり、項目テンプレートで各グループを適切にカスタマイズできます。ChildRepeater には、グループ内の各アイテムをカスタマイズできるアイテム テンプレートがあります。非常にクリーンで、すべて宣言型 UI を備えています。

<asp:Repeater runat="server" id="GroupRepeater">
 <ItemTemplate>
   <asp:Literal runat="server" id="HeaderText" />
   <asp:Repeater runat="server id="ChildRepeater">
    <ItemTemplate>
      <asp:Literal runat="server" id="InfoGoesHere" />
    </ItemTemplate>
   </asp:Repeater>
 </ItemTemplate>
</asp:Repeater>

コードビハインドでは、次のようなものを使用できます。

private void GroupRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
  //Get the child records, this can be any data structure you want
  SomeChildCollection children = ((SomeGroupCollection)e.Item.DataItem).Children;
  //Find the child repeater
  Repeater childRepeater = e.Item.FindControl("ChildRepeater") as Repeater;
  childRepeater.ItemDataBound += SomeMethod;
  childRepeater.DataSource = children;
  childRepeater.DataBind();
}

各子をバインドした後、ItemDataBound イベントをサブスクライブし、必要に応じて子をコントロールにバインドできます。

于 2009-02-04T11:27:49.677 に答える
0

dotnetjunkies コードにはいくつかのバグがあるようですが、ここでもっと簡単な解決策を見つけましたhttp://www.west-wind.com/weblog/posts/140753.aspx

現在、リピーターはグループ化をサポートしていないため、自分でこれを行う必要がありますが、それは非常に簡単です. 上記のリピーターでは、次のデータ式がグループ化を担当しています。

<%# this.RenderGroup(Eval("Group") as
string) %> 

この式は、フォームのメソッドを呼び出して、追加の div タグをレンダリングします。この単純なメソッドのコードは次のようになります。

string LastGroup = "@#@~";
protected string RenderGroup(string Group) {   
    if (Group == this.LastGroup)       
    return "";     // *** Group has changed    
    this.LastGroup = Group;    
    return "<div class='groupheader'>" +Group + "</div>";
}

このコードはすべてのアイテムに対して呼び出され、グループが変更されたかどうかを確認するだけです。何も返されない場合は、単純な div タグが文字列として返され、マークアップに埋め込まれます。私は HTML を送り返すことにしましたが、true または false を返し、リピーターで条件付きでコントロールをレンダリングすることもできると思います。

于 2009-02-04T11:20:55.213 に答える
0

ソリューションをジョエルするには、次のようにアドバイスする場合があります-この行を変更します。

header.Text = string.Format("<strong> {0} </strong><br/><table>", CurCountry);

header.Text = string.Format(header.Text, CurCountry);

さらに、.as?x ファイルからルック アンド フィールをカスタマイズできます。

于 2009-02-03T14:58:25.493 に答える
0

ああ、あなたはグループ化のリピーターを求めています。私が過去に採用した解決策は消えてしまったようです多分あなたはそれを見つけることができます。とにかく、リピーターのグループ化を検索すると役立つはずです。

于 2009-02-03T14:22:12.740 に答える