Форматировать данные в повторителе - PullRequest
0 голосов
/ 02 декабря 2011

Результат хранимой процедуры будет выглядеть следующим образом.

    1   Group Admin     user1    
    1   Group Admin     user2 
    1   Group Admin     user3
    1   Group Admin     user4 
    1   Group Admin     user5    
    2   Group Second    user6    
    2   Group Second    user7 
    2   Group Second    user8    
    2   Group Second    user9    
    2   Group Second    user10 
    2   Group Second    user11

Я хочу отформатировать данные, как показано на рисунке.

Вопрос связан с this

Я думаю, Repeater - лучший элемент управления для использования здесь.Что ты думаешь ?Если так, как я могу отформатировать это?GridView со слиянием строк - хорошая идея?

enter image description here

После прочтения ответа

// Page_Load
DataSet ds = GetAllUsers();

ViewState["UserRoles"] = ds;

rptParent.DataSource = ds;
rptParent.DataBind();

Другие события

// ItemDataBound
 protected void rptParent_ItemDataBound(object sender, RepeaterItemEventArgs e)
        {
            RepeaterItem item = e.Item;
            if ((item.ItemType == ListItemType.Item) ||
                (item.ItemType == ListItemType.AlternatingItem))
            {
                string s = e.Item.DataItem.ToString();
                string roleID = ((HiddenField)e.Item.FindControl("hidRoleId")).Value;
                Repeater childRepeater = (Repeater)item.FindControl("rptChild");
                string filterExp = "RoleId=" + roleID;
                DataTable dtChild = ((DataSet)ViewState["UserRoles"]).Tables[0];
                DataRow[] dr = dtChild.Select(filterExp);
                childRepeater.DataSource = dr;
                childRepeater.DataBind();
            }
        }

Разметить

// MarkUp
<asp:Repeater runat="server" ID="rptParent" OnItemDataBound="rptParent_ItemDataBound">
            <ItemTemplate>
                <table>
                    <tr>
                        <td>
                            <asp:HiddenField ID="hidRoleId" runat="server" Value='<%#Eval("RoleId")%>' />
                            <asp:Label ID="lblRoleName" runat="server" Text='<%#Eval("RoleName")%>'></asp:Label>
                        </td>
                        <td>
                            <asp:CheckBox ID="CheckBox4" runat="server" />
                        </td>
                        <td>
                            <asp:CheckBox ID="CheckBox5" runat="server" />
                        </td>
                        <td>
                            <asp:CheckBox ID="CheckBox6" runat="server" />
                        </td>
                    </tr>
                </table>
                <asp:Repeater ID="rptChild" runat="server">
                    <ItemTemplate>
                        <table>
                            <tr>
                                <td>
                                    <asp:HiddenField ID="hidRoleId" runat="server" Value='<%#Eval("UserId")%>' />
                                    <asp:Label ID="Label2" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "UserName") %>'></asp:Label>
                                </td>
                                <td>
                                    <asp:CheckBox ID="CheckBox7" runat="server" />
                                </td>
                                <td>
                                    <asp:CheckBox ID="CheckBox8" runat="server" />
                                </td>
                                <td>
                                    <asp:CheckBox ID="CheckBox9" runat="server" />
                                </td>
                            </tr>
                        </table>
                    </ItemTemplate>
                </asp:Repeater>
            </ItemTemplate>
        </asp:Repeater>

Я получаю следующий вывод

enter image description here

Но имя группы также повторяется :(. Это НЕ то, что я хочу

1 Ответ

1 голос
/ 02 декабря 2011

Я бы использовал вложенный повторитель.

С Linq вы можете легко сгруппировать данные и связать их с внешним повторителем (и установить значения для 3 верхних флажков), а затем OnDataBound внешнего повторителяМожно установить список пользователей в качестве источника данных для вложенного повторителя.

Разметка будет выглядеть следующим образом:

<asp:Repeater runat="server" ID="ParentRepeater" OnItemDataBound="ParentRepeater_ItemDataBound">
    <ItemTemplate>
            // Markup for the three top checkboxes
            <asp:Repeater runat="server" ID="ChildRepeater">
                <ItemTemplate>
                   // Inner layout for each user with checkboxes
                </ItemTemplate>
            </asp:Repeater>
        </div>
    </ItemTemplate>
</asp:Repeater>

А в коде:

protected void ParentRepeater_ItemDataBound(object sender, System.Web.UI.WebControls.RepeaterItemEventArgs e)
{
    RepeaterItem item = e.Item;
    if ((item.ItemType == ListItemType.Item) ||
        (item.ItemType == ListItemType.AlternatingItem))
    {
        var data = item.DataItem as <YourType>;

        Repeater childRepeater = (Repeater)item.FindControl("ChildRepeater");
        childRepeater .DataSource = data.<InnerResults>;
        childRepeater .DataBind();
    }
} 

Если вам нужноЧтобы использовать анонимный тип для группировки, взгляните на класс Tuple <,>.Это может помочь, если вы хотите привести item.DataItem обратно к известному типу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...