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.
|