webForumDet fria alternativet

sätta värde

.NETur .NET

7 svar · 371 visningar · startad av DavidB

Medlem sedan jan. 20001 372 inlägg
Frågan#1

Hej!

Jag har följande kod:

<asp:TemplateColumn>
<HeaderTemplate><asp:LinkButton id="[b]TitleText[/b]" CommandName="sort" class="siteheadline" runat="server" /></HeaderTemplate>
<ItemTemplate><asp:HyperLink NavigateUrl='/index.aspx?id=<%# DataBinder.Eval(Container, "DataItem.UserId") %>' Text='<%# DataBinder.Eval(Container, "DataItem.Title") %>' class="sitetext" runat="server" /></ItemTemplate>
</asp:TemplateColumn>

Nu är det så att jag har två problem.

1. Varför går det inte att sätta TitleText.Text från min CodeBehind?
Får följande fel:

System.NullReferenceException: Object reference not set to an instance of an object.

Det fungerar med alla andra Kontroller som inte ligger i en DataGrid. Nån som vet?

2. Om jag har följande kod:

NavigateUrl='/index.aspx?id=<%# + DataBinder.Eval(Container, "DataItem.UserId") %>'

så blir Url:en som man kommer till om man klickar:
localhost/index.aspx?id=<%# + DataBinder.Eval(Container, "DataItem.UserId") %>
Dock om jag har följande kod:

NavigateUrl='<%# + DataBinder.Eval(Container, "DataItem.UserId") %>'

Så blir Url:en:
localhost/ID
Men det jag vill är att man skall komma till:
localhost/index.aspx?ID
Nån som vet?

Sen e det en tredje grej och det är hur sätter man bakgrundsfärg på en TableCell från en codebehind?

Medlem sedan juni 20011 732 inlägg
#2

Kan svara på fråga 2 och 3 lite snabbt:

NavigateUrl='<%# "/index.aspx?id=" + DataBinder.Eval(Container, "DataItem.UserId") %>'

och

DataGrid1.Items[2].Cells[3].BackColor = Color.Blue;

På första frågan så måste du se till att du befinner dig i din headertemplate. Jag brukar använda ItemDataBound-eventet för att komma åt saker i mina datagrids. Lägg en koll där så du bara kör koden i headern. Nåt i den här stilen skulle jag tro:

public void myFunction(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e) {
//Om vi är i headern:
  if (e.Item.ItemType == ListItemType.Header) {
// ...så kör du en findcontrol: 
    ((LinkButton)e.Item.FindControl("myLB")).Text = "lajban";
  }
}
Medlem sedan juni 20011 732 inlägg
#3

Ojdå, på sista frågan menade du kanske det här?

TableCell tc = new TableCell();
tc.BackColor = Color.Blue;

:)

Medlem sedan jan. 20001 372 inlägg
#4
public void myFunction(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e) {
//Om vi är i headern:
  if (e.Item.ItemType == ListItemType.Header) {
// ...så kör du en findcontrol: 
    ((LinkButton)e.Item.FindControl("myLB")).Text = "lajban";
  }
}

Fattar inte så mycket av koden ova. Hur göra man om man vill ha in den i PageLoaden och inte ha den som en egen funktion?

Medlem sedan juni 20011 732 inlägg
#5

Varför ska du ha den i pageloaden? En bra regel är att ha så lite kod som möjligt där.

Använder du vs.net? Gå i så fall till dina events för din datagrid, där har du något som heter DataGridItemEvent. Det är denna du ska använda... det är helt enkelt ett event som körs för varje rad när din datagrid byggs upp, något du kan utnyttja om du ska göra förändringar i den från koden...

Har du inte vs.net skriver du bara onItemDataBound="myFunction" i din datagrid.

Vill du ändå göra detta i pageloaden måste du hitta kontrollen i din header. Din headertemplate är en kontroll (inte ett item) precis som din linkbutton, tror jag. Eftersom headern då är den första kontrollen i din datagrid så borde du hitta den här:

myDG.Controls[0]

Denna innehåller sedan i sin tur ett antal kontroller, då får du antingen göra en findcontrol eller leta upp den manuellt. Om din linkbutton är den första kontrollen så borde du hitta den så här:

((LinkButton)myDG.Controls[0].Controls[0]).Text = "foo";

Men det är ju inte alls säkert att det är din första kontroll så du får prova lite... skriv ut och se vad du hittar eller gör en trace. Men enklast är nog en findcontrol som sagt.

Medlem sedan jan. 20001 372 inlägg
#6

använder inte VS.Net

Det var nog "onItemDataBound="myFunction"" som jag sökte, men jag får det inte att fungera nu ändå.

Koden ser ut såhär:

public void SetTitle(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e) {
	if (e.Item.ItemType == ListItemType.Header) {
		((LinkButton)e.Item.FindControl("TitleText")).Text = "Titel:";
	}
}

och min headertemplate:

<HeaderTemplate>
<asp:LinkButton id="TitleText" CommandName="sort" class="siteheadline" runat="server" />
</HeaderTemplate>

E det nånting jag har missat?

Medlem sedan juni 20011 732 inlägg
#7

Får du något felmeddelande?

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwebuiwebcontrolsdatagridclassonitemdataboundtopic.asp

Obs! Av någon anledning så vill inte länken ovan fungera när jhag lägger in den här på webbforum, men om du tar boprt % 20 och < br% 20/> i url:en så kommer du rätt...

Medlem sedan jan. 20001 372 inlägg
#8

fick det att fungera, var bara jag som har gjort en liten tabbe :)

136 ms totalt · 3 externa anrop · v20260731065814-full.25f56b17
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)