webForumDet fria alternativet

Dunamiskt skriva till Labeler.

.NET

11 svar · 557 visningar · startad av saw

Medlem sedan mars 20011 880 inlägg
Frågan#1

Jag vill först tackaför den hjälp jag fick med "Problem med att översätta ifrån VB-script till Asp.net 2.0 C# ", och jag vill fortfarande refferera till den tråden.
Nu tar jag ju fram min sql dynamiskt och via adapter fyller labelerna:

Lfraga_1.Text = "<b>Fråga 1:</b><br/> " + ds.Tables["Quize"].Rows[0]
["Fraga"].ToString();
Lfraga_2.Text = "<b>Fråga 2:</b><br/> " + ds.Tables["Quize"].Rows[1]
["Fraga"].ToString();

osv. Det ser ju inte så praktiskt ut, och jag skall också ge mig på att fylla
upp texter till radioknappar, så jag tänkte såhär:

for (int i = 1; i < 11; i++)
 {
  Label myLabel = new Label(Lfraga_ + i);
  ((Label)FindControl(myLabel)).Text = "<b>Fråga " + i + ":</b><br/> " + 
ds.Tables["Quize"].Rows[i -1]["Fraga"].ToString();
               
  }

Nu får jag en massa fel:

Error	1	Namnet Lfraga_ finns inte i den aktuella kontexten
	F:\Inetpub\wwwroot\ASP_Net-Test\Saw-
Asp.net\Quize\Quize.aspx.cs	112	43	F:\...\Saw-Asp.net\
Error	2	Den överlagrade metod som bäst matchar 
System.Web.UI.Control.FindControl(string) har några ogiltiga argument
	F:\Inetpub\wwwroot\ASP_Net-Test\Saw-
Asp.net\Quize\Quize.aspx.cs	113	25	F:\...\Saw-Asp.net\
Error	3	Argumentet 1: kan inte konverteras från 
System.Web.UI.WebControls.Label till string
	F:\Inetpub\wwwroot\ASP_Net-Test\Saw-
Asp.net\Quize\Quize.aspx.cs	113	37	F:\...\Saw-Asp.net\

Skall man inte kunna göra så här???

Medlem sedan dec. 19996 721 inlägg
#2

FindControl använder man för att hitta en en instans av en kontroll, när man bara vet namnet. I ditt fall så har du ju redan instansen!

for (int i = 1; i < 11; i++)
 {
  Label myLabel = new Label(Lfraga_ + i);
//myLabel är instansen!!
  myLabel.Text = "<b>Fråga " + i + ":</b><br/> " + ds.Tables["Quize"].Rows[i -1]["Fraga"].ToString();

//Här måste du lägga till myLabel till sidan eller någon annan kontroll. t.ex.
//this.Controls.Add(myLabel);
               
}

Du bör dock använda en list-kontroll av något slag i stället för att bygga upp kontroller dynamiskt.

Medlem sedan mars 20011 880 inlägg
#3

Tack för svar.
Jag är nog lite för rädd för att laborera med List, har äldrig gjort det själv,
utan fått de tips som jag använder mig av.

Hursomhelst, ditt förslag verkar ju bra, men jag får ett error:

Label myLabel = new Label("Lfraga_" + i.ToString());
'och errot
Error	1	Ingen överlagring för metoden Label tar 1 argument
	F:\Inetpub\wwwroot\ASP_Net-Test\Saw-
Asp.net\Quize\Quize.aspx.cs	156	33	F:\...\Saw-Asp.net\
'om jag inte har fnuttar runt lFraga så får jag error:
Error	1	Namnet Lfraga_ finns inte i den aktuella kontexten
	F:\Inetpub\wwwroot\ASP_Net-Test\Saw-
Asp.net\Quize\Quize.aspx.cs	156	43	F:\...\Saw-Asp.net\

Visst skall man väll kunna göra så här?

Medlem sedan dec. 19996 721 inlägg
#4

Missade den delen...

Om du använder Visual Web Developer eller Visual Studio, så borde det synas tämligen snabbt var detta ligger.

Label tar inga argument i konstruktorn. Sätt värdet med .Text-egenskapen i stället.

saw skrev:

Jag är nog lite för rädd för att laborera med List, har äldrig gjort det själv,
utan fått de tips som jag använder mig av.

Med list-kontroll syftade jag på Repeater, GridView, DataList el. likn.

Medlem sedan mars 20011 880 inlägg
#5

Då ser det ut som om jag går på pumpen.
om jag gör så här:

 Label myLabel = new Label();
                //myLabel är instansen!!
                myLabel.Text = "<b>Fråga " + i + ":<p></p> " + ds.Tables
["Quize"].Rows[i - 1]["Fraga"].ToString();

                //Här måste du lägga till myLabel till sidan eller någon annan kontroll. t.ex.
               this.Controls.Add(myLabel);

Så har jag inga error, men texten skrivs inte ut i de befinntliga labelerna.
Mitt stora problem ligger i :

new Label(Lfraga_ + i.ToString())

och mycket riktigt, VS visar på att det är ett fel här.
Den tror att labellen skall heta Lfraga_, men den skall ju heta Lfraga_1 t ex.
Eftersom jag jobbar i en wizard, så ville jag inte ha någon repeater el dyl.
Är detta olösligt?
Måste jag i såfall hårdkoda allt?

Medlem sedan dec. 19996 721 inlägg
#6

Jaha, du har färdiga Labels. Då ska du inte skapa nya med "new", och inte heller lägga till dem.

Label myLabel =FindControl("Lfraga_" + i.ToString()) as Label;

Jag vet inte hur din sida ska se ut, men jag tror att en Repeter skulle sitta fint, wizard eller ej.

Medlem sedan mars 20011 880 inlägg
#7

Jag har full förståelse om du tröttna på mig, men jag springer på patrull
hela tiden:

Label myLabel = (Label)FindControl("Lfraga_" + i.ToString());
           myLabel.Text = "<b>Fråga " + i + ":<p></p> " + ds.Tables
["Quize"].Rows[i - 1]["Fraga"].ToString();

Och så får jag error:

"Nullreferenceexeption was unhandled by user code" (Detta är titlen)
Objektreferensen har inte angetts till en instans av ett objekt.

Som du ser, så var jag tvungen att ändra på lite eftersom det är i C# jag
kodar.

Medlem sedan dec. 19996 721 inlägg
#8

Felet beror på att Label-kontrollen inte hittas eller ds.Tables["Quize"].Rows[i - 1]["Fraga"] inte kan hittas. Något är null, med andra ord.

saw skrev:

Som du ser, så var jag tvungen att ändra på lite eftersom det är i C# jag
kodar.

Det gör jag också, och mitt kodexempel var C#.

Medlem sedan mars 20011 880 inlägg
#9

as Label; är det inte VB.net?

Medlem sedan sep. 20011 914 inlägg
#10

.aspx

<asp:repeater id="repQuiz" runat="server">
   <itemtemplate>
      <asp:label id="lbQ" runat=server" />
   </itemtemplate>
</asp:repeater>

.cs

protected void Page_Load(object sender, EventArgs e)
{
   if(!IsPostBack)
      Bind();
}

private void Bind()
{
   //GetDataset
   DataSet ds1 = new DataSet();
   //Fill dataset any way you want

   repQuiz.DataSource = ds1;
   repQuiz.DataBind();
}

protected void repQuiz_itemdatabound(object sender, RepeaterItemEventArgs e)
{
   if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
   {
      DataRowView drv = (DataRowView)e.Item.DataItem;

      string s = string.Format("Fråga {0}<br/><br/>{1}", (e.Item.ItemIndex + 1).ToString(), drv.Row["Fraga"].ToString());
      ((Label)e.Item.FindControl("lbQ")).Text = s;
   }
}
Medlem sedan mars 20011 880 inlägg
#11

Tack för detta Dino, jag skall kolla det.

Medlem sedan dec. 19996 721 inlägg
#12

Bra förslag, Dino!

Beroende på hur sidan ska se ut så kan man tänka sig att man kan göra allt i aspx-filen, utan att behöva någon kod i ItemDataBound.

        <asp:Repeater ID="repQuiz" runat="server">
        <ItemTemplate>
            Fråga <%#Eval("frågeNummer") %><br/><br/>
            <%#Eval("fråga") %>
        </ItemTemplate>
        </asp:Repeater>
264 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
129 ms — deklarationer (db)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)
128 ms — ändringar (db)