Problém se stránkováním a indexy   otázka

C#, ASP.NET WebForms

Ahoj,

mám takový menší problém. Mám stránku se správou uživatelů, kde vypíšu všechny uživatele z databáze. Inspiroval jsem se jedním článkem ze seriálu o ASP.NET, takže kody jsou docela podobné těm ze seriálu. Fungovalo to v pohodě do té doby, dokud jsem nedal na tuto stránku stránkování. Protože je tam těch uživatelů docela hodně, bez stránkování by to asi nešlo. Jakmile jsem tam dal stránkování, tak při pokusu o změnu role u uživatele mi to vypíše chybu:

"Index was out of range. Must be non-negative and less than the size of the collection.

Parameter name: index"

na řádku:


  string username = (string)GridView1.DataKeys[row.DataItemIndex].Value;

Celý kod mám tady:

%@ Page Language="C#" MasterPageFile="~/MasterPage.master" Title="Správa uživatelů" %>

<script runat="server">
   
    private string ConvertSortDirectionToSql(SortDirection sortDirection)
    {
        string newSortDirection = String.Empty;

        switch (sortDirection)
        {
            case SortDirection.Ascending:
                newSortDirection = "ASC";
                break;

            case SortDirection.Descending:
                newSortDirection = "DESC";
                break;
        }
        return newSortDirection;
    }

    protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
        GridView1.DataSource = Membership.GetAllUsers();
        GridView1.PageIndex = e.NewPageIndex;
        GridView1.DataBind();
    }
    protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
    {
        System.Data.DataTable dataTable = GridView1.DataSource as System.Data.DataTable;

        if (dataTable != null)
        {
            System.Data.DataView dataView = new System.Data.DataView(dataTable);
            dataView.Sort = e.SortExpression + " " + ConvertSortDirectionToSql(e.SortDirection);

            GridView1.DataSource = dataView;
            GridView1.DataBind();
        }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!this.IsPostBack)
        {
            GridView1.DataSource = Membership.GetAllUsers();
            GridView1.DataBind();
        }
    }

    protected void InterAdminCheckBox(object sender, EventArgs e)
    {
        CheckBox chb = (CheckBox)sender;
        GridViewRow row = (GridViewRow)chb.NamingContainer;
        string username = (string)GridView1.DataKeys[row.DataItemIndex].Value;

        if (chb.Checked)    
            Roles.AddUserToRole(username, "Interní admin");
        else               
            Roles.RemoveUserFromRole(username, "Interní admin");
    }
   
    protected void ExterAdminCheckBox(object sender, EventArgs e)
    {
        CheckBox chb = (CheckBox)sender;
        GridViewRow row = (GridViewRow)chb.NamingContainer;
        string username = (string)GridView1.DataKeys[row.DataItemIndex].Value;

        if (chb.Checked)   
            Roles.AddUserToRole(username, "Externí admin");
        else               
            Roles.RemoveUserFromRole(username, "Externí admin");
    }
    protected void InterUserCheckBox(object sender, EventArgs e)
    {
        CheckBox chb = (CheckBox)sender;
        GridViewRow row = (GridViewRow)chb.NamingContainer;
        string username = (string)GridView1.DataKeys[row.DataItemIndex].Value;

        if (chb.Checked)    
            Roles.AddUserToRole(username, "Interní uživatel");
        else               
            Roles.RemoveUserFromRole(username, "Interní uživatel");
    }
    protected void ExterUserCheckBox(object sender, EventArgs e)
    {
        CheckBox chb = (CheckBox)sender;
        GridViewRow row = (GridViewRow)chb.NamingContainer;
        string username = (string)GridView1.DataKeys[row.DataItemIndex+30].Value;

        if (chb.Checked)     
            Roles.AddUserToRole(username, "Externí uživatel");
        else                
            Roles.RemoveUserFromRole(username, "Externí uživatel");
    }

    protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "DeleteUser")     
        {
            Membership.DeleteUser(e.CommandArgument.ToString());
            Response.Redirect("~/Admin/SpravaUzivatelu.aspx");
        }
    }
    protected void Button1_Click(object sender, EventArgs e)
    {

        try
        {
            GridView1.DataSource = Membership.FindUsersByName(UserName.Text + "%");
        }
        catch (Exception ex)
        {
            GridView1.DataSource = Membership.GetAllUsers();
        }
        GridView1.DataBind();        
    }
    protected void UserName_TextChanged(object sender, EventArgs e)
    {
        try
        {
            GridView1.DataSource = Membership.FindUsersByName(UserName.Text + "%");
        }
        catch (Exception ex)
        {
            GridView1.DataSource = Membership.GetAllUsers();
        }
        GridView1.DataBind();
    }
</script>

<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">

    <h1>Správa uživatelů</h1>
    
    <p>
        <asp:TextBox ID="UserName" runat="server" ontextchanged="UserName_TextChanged"></asp:TextBox>
        <asp:Button ID="Button1" runat="server" Text="Vyhledej uživatele" 
            onclick="Button1_Click" />
    </p>
    <asp:GridView ID="GridView1" 
    OnPageIndexChanging="GridView1_PageIndexChanging" OnSorting="GridView1_Sorting" 
    runat="server" AllowPaging="True" AutoGenerateColumns="False" PageSize="30">
  
        <PagerSettings PageButtonCount="30" />
              <Columns>
            <asp:BoundField HeaderText="Uživatelské jméno" ItemStyle-Font-Bold="true" 
                DataField="UserName" >
<ItemStyle Font-Bold="True"></ItemStyle>
            </asp:BoundField>
            <asp:BoundField HeaderText="E-mail" DataField="Email" />
            <asp:BoundField HeaderText="Naposledy přihlášen" DataField="LastLoginDate" />
            <asp:TemplateField HeaderText="Interní Administrátor" ItemStyle-HorizontalAlign="Center">
                <ItemTemplate>
                    <asp:CheckBox ID="InterAdminCheckBox" runat="server" Enabled='<%#Eval("UserName").ToString() != "student" %>' Checked='<%#Roles.IsUserInRole(Eval("UserName").ToString(), "Interní Admin") %>' AutoPostBack="true" OnCheckedChanged="InterAdminCheckBox" />
                </ItemTemplate>

<ItemStyle HorizontalAlign="Center"></ItemStyle>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Externí admin" ItemStyle-HorizontalAlign="Center">
                <ItemTemplate>
                    <asp:CheckBox ID="ExterAdminCheckBox" runat="server" Checked='<%#Roles.IsUserInRole(Eval("UserName").ToString(), "Externí admin") %>' AutoPostBack="true" OnCheckedChanged="ExterAdminCheckBox" />
                </ItemTemplate>

<ItemStyle HorizontalAlign="Center"></ItemStyle>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Interní uživatel" ItemStyle-HorizontalAlign="Center">
                <ItemTemplate>
                    <asp:CheckBox ID="InterUserCheckBox" runat="server" Checked='<%#Roles.IsUserInRole(Eval("UserName").ToString(), "Interní uživatel") %>' AutoPostBack="true" OnCheckedChanged="InterUserCheckBox" />
                </ItemTemplate>

<ItemStyle HorizontalAlign="Center"></ItemStyle>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Externí uživatel" ItemStyle-HorizontalAlign="Center">
                <ItemTemplate>
                    <asp:CheckBox ID="ExterUserCheckBox" runat="server" Checked='<%#Roles.IsUserInRole(Eval("UserName").ToString(), "Externí uživatel") %>' AutoPostBack="true" OnCheckedChanged="ExterUserCheckBox" />
                </ItemTemplate>

<ItemStyle HorizontalAlign="Center"></ItemStyle>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="">
                <ItemTemplate>
                    <asp:LinkButton ID="DeleteUserButton" runat="server" Visible='<%#Eval("UserName").ToString() != "admin" %>' CommandName="DeleteUser" CommandArgument='<%#Eval("UserName") %>' OnClientClick="javascript: return confirm('Opravdu chcete uživatele smazat?');">Odstranit</asp:LinkButton>
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>
</asp:Content>

Kdyby si s tím někdo věděl rady a pomohl, byl bych moc vděčný, děkuji za odpovědi.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback