Zaiman Medlem sedan dec. 2001 4 239 inlägg Frågan 20 jan. 2008 20:36 #1 Sitter och funderar på hur jag ska få till en sak.
Har en gridview och i den en knapp. Knappen ska bara vara visad om administratören är inloggad. Men hur får jag tag på knappen som ligger i griden?
Försökt söka, men vet inte riktigt på vad jag ska söka efter.
Luddigt?
CatZ Medlem sedan jan. 2002 2 440 inlägg Det enklast är att ha kontrollen i en templatefield, då kan du köra en FindControl i OnRowDataBound
protected void gvResults_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (!User.IsInRole("DinRoll") | (!User.IsInRole("DinAndraRoll")))
{
lb = (LinkButton) GridView1.FindControl("DinKnapp");
lb.Enabled = false;
lb.Visible = false;
}
}
CatZ Medlem sedan jan. 2002 2 440 inlägg Bättre ändå är väl att ha knappen som osynlig från start och sedan göra den synlig om anvädaren har ett visst värde i session / roller / kakor
Zaiman Medlem sedan dec. 2001 4 239 inlägg
CatZ skrev:
Bättre ändå är väl att ha knappen som osynlig från start och sedan göra den synlig om anvädaren har ett visst värde i session / roller / kakor
Jepps, det var så jag hade tänkt styra det.
Zaiman Medlem sedan dec. 2001 4 239 inlägg Hmm.. Det sket sig..
Förmodligen på grund av min Membership provider för MySQL, ska prova byta ut den mot den som finns med i 5.1.4 versionen.
Återkommer när jag gjort det, kan ta en stund....
CatZ Medlem sedan jan. 2002 2 440 inlägg Vad har du för kod? Felmeddelande? Vi finns här och kan hjälpa till ;)
Zaiman Medlem sedan dec. 2001 4 239 inlägg Felmeddelandet:
Object reference not set to an instance of an object
Hjälpte inte att byta provider.
CatZ Medlem sedan jan. 2002 2 440 inlägg japp japp det är för att den inte hittar knappen... kör du en FindControl? I så fall måste du ha det som TemplateField i GridViewn och namnge din knapp.
Så när du kommer till lb.Enabled = true; så är lb = null därför får du felmeddelandet.
Zaiman Medlem sedan dec. 2001 4 239 inlägg Snyft.. Men det är ju så jag har det.
Eller fungerar det inte på en ImageButton?
Modifierade koden som gavs tidigare:
if (User.IsInRole("blagruppen"))
{
ImageButton lb = (ImageButton)GridView1.FindControl("btnAdminDelete");
// lb.Enabled = false;
lb.Visible = true;
}
F freguz Medlem sedan feb. 2005 280 inlägg Kan man få se all relevant kod så kanske det gingo att lista ut något ;-)
Zaiman Medlem sedan dec. 2001 4 239 inlägg Codebehind:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class guestbook : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
SkrivGB.Visible = false;
}
protected void Button2_Click(object sender, EventArgs e)
{
if (SkrivGB.Visible == false)
{
SkrivGB.Visible = true;
GridView1.Visible = false;
}
}
protected void Button1_Click(object sender, EventArgs e)
{
string mess = txtMeddelande.Text.TrimEnd();
string namn = txtNamn.Text.TrimEnd();
string ip = Request.UserHostAddress.ToString();
DateTime t = System.DateTime.Now;
EdcTableAdapters.gbookTableAdapter p = new EdcTableAdapters.gbookTableAdapter();
p.addPost(namn, ip, mess, t);
GridView1.DataBind();
GridView1.Visible = true;
p.Dispose();
}
protected void btnAvbryt_Click(object sender, EventArgs e)
{
SkrivGB.Visible = false;
GridView1.Visible = true;
}
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (User.IsInRole("Administrators"))
{
ImageButton lb = (ImageButton)GridView1.FindControl("btnAdminDelete");
// lb.Enabled = false;
lb.Visible = true;
}
}
protected void GridView1_PreRender(object sender, EventArgs e)
{
}
}
.aspx sidan
<%@ Page Language="C#" MasterPageFile="~/Masterpages/MasterPage.master" AutoEventWireup="true" CodeFile="guestbook.aspx.cs" Inherits="guestbook" Title="Eskilstuna dykcenter Gästbok" Debug="false" Theme="edctheme" ValidateRequest="false" %>
<%@ Register TagPrefix="FTB" Namespace="FreeTextBoxControls" Assembly="FreeTextBox" %>
<asp:Content ID="Content1" ContentPlaceHolderID="Main" Runat="Server">
<br />
<script type="text/javascript" src="gbook.js"></script>
<div style="width: 740px; height: 25px; text-align: left">
<asp:Button ID="btnSkriv" runat="server" EnableViewState="False" OnClick="Button2_Click" Text="Skriv i gästboken" SkinID="edcButton" />
</div>
<asp:Panel ID="SkrivGB" runat="server" Width="691px" HorizontalAlign="Left" ScrollBars="Auto" Wrap="False">
<div style="border-right: gray 1px dashed; border-top: gray 1px dashed; border-left: gray 1px dashed;
border-bottom: gray 1px dashed">
<table>
<tr>
<td style="width: 94px; height: 21px">
Namn:
<asp:TextBox ID="txtNamn" runat="server" EnableViewState="False" MaxLength="40" Width="335px"></asp:TextBox>
<asp:RequiredFieldValidator ID="validateNamn" runat="server" ControlToValidate="txtNamn"
ErrorMessage="Du måste ange ett namn!" SetFocusOnError="True" Width="393px"></asp:RequiredFieldValidator></td>
<td style="width: 220px; height: 21px">
</td>
</tr>
<tr>
<td style="height: 21px" colspan="2">
Meddelande:<FTB:FreeTextBox id="txtMeddelande" runat="server" AllowHtmlMode="False" Language="sv-se" Width="600" Height ="300" EnableViewState="False" RenderMode="Rich" toolbarlayout="FontFacesMenu,FontForeColorsMenu,FontForeColorPicker,FontBackColorsMenu,FontBackColorPicker|Bold,Italic,Underline,Strikethrough,Insert Image from gallery" EnableHtmlMode="False" ImageGalleryPath="~/images/Smiley" ImageGalleryUrl="gb.imagegallery.aspx?rif={0}&cif={0}" SupportFolder="~/aspnet_client/FreeTextBox/"></FTB:FreeTextBox>
<asp:RequiredFieldValidator ID="validateMeddelande" runat="server" ControlToValidate="txtMeddelande"
ErrorMessage="Du måste ju skriva något också!" SetFocusOnError="True" Width="600px"></asp:RequiredFieldValidator></td>
</tr>
<tr>
<td style="width: 94px; height: 21px">
<asp:Button ID="btnAvbryt" runat="server" OnClick="btnAvbryt_Click" Text="Avbryt / Visa inlägg" SkinID="edcButton" CausesValidation="False" /></td>
<td style="width: 220px; height: 21px; text-align: right">
<asp:Button ID="Button1" runat="server" Text="Spara" OnClick="Button1_Click" SkinID="edcButton" /></td>
</tr>
</table>
</div>
</asp:Panel>
<br />
<asp:GridView ID="GridView1" runat="server" AllowPaging="True" AutoGenerateColumns="False"
DataSourceID="ObjectDataSource1" GridLines="None" Height="283px" PageSize="5"
Width="662px" OnRowDataBound="GridView1_RowDataBound" OnPreRender="GridView1_PreRender">
<PagerSettings Mode="NumericFirstLast" />
<Columns>
<asp:TemplateField>
<ItemTemplate>
<table border="0" cellpadding="0" cellspacing="0" class="photo-frame" style="width: 70%">
<tr>
<td class="topx--" style="height: 4px; witdh: 1px">
</td>
<td class="top-x-" style="width: 1px; height: 4px">
</td>
<td class="top--x" style="height: 4px">
</td>
</tr>
<tr>
<td class="midx--" style="witdh: 1px">
</td>
<td style="text-align: right">
<table style="width: 406px">
<tr>
<td class="smallText" style="text-align: left">
Från
<asp:Label ID="Label1" runat="server" Text='<%# Bind("Namn") %>' CssClass="smallText"></asp:Label>:</td>
</tr>
<tr>
<td style="height: 21px; text-align: left;">
<asp:Label ID="Meddelandet" runat="server" CssClass="smallText" Text='<%# Bind("meddelande") %>'></asp:Label></td>
</tr>
<tr>
<td style="height: 21px; text-align: right">
<asp:Label ID="Datum" runat="server" CssClass="minTextKursiv" Text='<%# Bind("datum") %>' Font-Italic="True"></asp:Label></td>
</tr>
</table>
<asp:ImageButton ID="btnAdminDelete" runat="server"
ImageUrl="~/Images/btn-radera.gif" Visible='False' /></td>
<td class="mid--x">
</td>
</tr>
<tr>
<td class="botx--" style="height: 4px; witdh: 1px">
</td>
<td class="bot-x-" style="height: 4px">
</td>
<td class="bot--x" style="height: 4px">
</td>
</tr>
</table>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" SelectMethod="GetData" TypeName="EdcTableAdapters.gbookTableAdapter" InsertMethod="Insert" OldValuesParameterFormatString="original_{0}">
<InsertParameters>
<asp:Parameter Name="Namn" Type="String" />
<asp:Parameter Name="epost" Type="String" />
<asp:Parameter Name="ip" Type="String" />
<asp:Parameter Name="meddelande" Type="String" />
<asp:Parameter Name="smiley" Type="String" />
<asp:Parameter Name="datum" Type="DateTime" />
<asp:Parameter Name="Websida" Type="String" />
</InsertParameters>
</asp:ObjectDataSource>
</asp:Content>
All kod som den ser ut idag. Hoppas jag inte missat något.
CatZ Medlem sedan jan. 2002 2 440 inlägg Enkelt eftersom du postar koden, hade inte behövt hela men men :)
if (e.Row.RowType == DataControlRowType.DataRow)
{
if (User.IsInRole("Administrators"))
{
ImageButton lb = (ImageButton)GridView1.FindControl("btnAdminDelete");
// lb.Enabled = false;
lb.Visible = true;
}
{
du måste ange vilken typ av rad den ska söka på! om du glömmer det blir det bajs :)
En fråga? Nu blir det två ;) Är det någon särskild anledning som gör att du krånglar med <table> och skit i din gridview? Det känns extremt dumt för mig. GridView sköter ju allt sånt automatiskt.
F freguz Medlem sedan feb. 2005 280 inlägg SKulle tro att i din RowDataBound() först måste kolla vilken typ av rad det är innan du kan leta upp den ImageButtonen (bra språk),
typ
if(e.Row.RowType == DataControlRowType.DataRow)
Zaiman Medlem sedan dec. 2001 4 239 inlägg Fungerar inte heller :(
Samma fel...
CatZ Medlem sedan jan. 2002 2 440 inlägg
Zaiman skrev:
Fungerar inte heller :(
Samma fel...
Det är för att du inte läst på om GridView...
http://www.asp.net/learn/videos/video-07.aspx
http://www.asp.net/learn/data-access/
Sist och absolut viktigast!
http://msdn2.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview(VS.80).aspx
Zaiman Medlem sedan dec. 2001 4 239 inlägg Hehe.. Det var inte lite att läsa ;)
Ska klura lite till.. :)
Zaiman Medlem sedan dec. 2001 4 239 inlägg Just ja, table frågan. Det är mest för att jag inte fick till designen som det blev så.
CatZ Medlem sedan jan. 2002 2 440 inlägg Har kollat lite på koden i Visual Studio, det var så knepigt att läsa den långa koden här. Du använder verkligen gridviewn som en repeater. Jag rekommenderar att du istället använder den som en gridview eller byter till en bättre lämpad kontroll om du vill ha mer kontroll över html'n. Om du kollar längst ner så har jag style:at mina rader olika beroende på vilken typ av rad det är. GridViewn har fullkomligt css-stöd vad jag vet. Du får göra som du vill men som det är nu tycker jag det blir svårt att hålla koll på vad som är vad i ditt itemtemplate vilket innebär att det kommer vara svårt för dig att underhålla det också.
Bifogar en kodsnutt på hur jag har gjort:
<asp:gridview runat="server" id="gvResults" autogeneratecolumns="False"
cssclass="styleGridView" onrowdatabound="gvResults_RowDataBound"
CellPadding="2" AllowPaging="True" ondatabound="gvResults_DataBound"
DataKeyNames="ID" onselectedindexchanged="gvResults_SelectedIndexChanged"
allowselection="true" GridLines="None">
<Columns>
<asp:CommandField SelectText="Detaljer" ShowSelectButton="True" />
<asp:boundfield DataField="ID" HeaderText="ID"
ReadOnly="false" SortExpression="ID" Visible="False"></asp:boundfield>
<asp:boundfield DataField="pDate" HeaderText="Datum"
SortExpression="pDate" DataFormatString="{0:d}" HtmlEncode="False"></asp:boundfield>
<asp:BoundField DataField="Type" HeaderText="Spelform" SortExpression="Type" />
<asp:templatefield HeaderText="FileName" Visible="false">
<itemtemplate>
<asp:Label ID="lblFileID" runat="server" Text='<%# Eval("FileID") %>'></asp:Label>
</itemtemplate>
</asp:templatefield>
<asp:TemplateField HeaderText="Resultat">
<ItemTemplate>
<asp:LinkButton ID="lbtnGvGetResult" runat="server" CausesValidation="False"
CommandName="Resultat" oncommand="lbtnGvGetResult_Command" Text="Resultat"
CommandArgument='<%# Eval("FileID") %>'></asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
</Columns>
<PagerTemplate>
<asp:ImageButton ID="ImageButton1" runat="server" ImageUrl="~/images/first.gif"
CommandArgument="First" CommandName="Paginate" oncommand="Paginate" />
<asp:ImageButton ID="ImageButton2" runat="server" ImageUrl="~/images/previous.gif"
CommandArgument="Prev" CommandName="Paginate" oncommand="Paginate" />
Page
<asp:DropDownList ID="ddlPages" runat="server"
AutoPostBack="True" onselectedindexchanged="ddlPages_SelectedIndexChanged">
</asp:DropDownList>
of
<asp:Label ID="lblPageCount"
runat="server"></asp:Label>
<asp:ImageButton ID="ImageButton3" runat="server" ImageUrl="~/images/next.gif"
CommandArgument="Next" CommandName="Paginate" oncommand="Paginate" />
<asp:ImageButton ID="ImageButton4" runat="server" ImageUrl="~/images/last.gif"
CommandArgument="Last" CommandName="Paginate" oncommand="Paginate" />
</PagerTemplate>
<footerstyle cssclass="styleGridFooter" />
<rowstyle cssclass="styleGridRow" />
<SelectedRowStyle CssClass="styleGridSelected" />
<headerstyle cssclass="styleGridHeader" />
<alternatingrowstyle cssclass="styleGridAltRow" />
</asp:gridview>
Zaiman Medlem sedan dec. 2001 4 239 inlägg Du har så rätt, men när jag började koda så var jag slö och vill dra nytta av "pageing" i gridviewn. (konstig mening). Slött dåligt och ruttet av mig. Men jag har lärt mig med tiden och kommit en bit vidare (ingen ursäkt för dålig kodning).
Ska mecka om den vid tillfälle.
Zaiman Medlem sedan dec. 2001 4 239 inlägg if (e.Row.RowType == DataControlRowType.DataRow)
{
if (User.IsInRole("Administrators"))
{
ImageButton lb = (ImageButton)e.Row.FindControl("btnAdminDelete");
lb.Visible = true;
}
}