Om du använder findcontrol då.
string Rubrik = ((TextBox)e.Item.findcontrol("Rubrik")).Text;
string Text = ((TextBox)e.Item.findcontrol("Huvudtext")).Text;
Välkommen till webForum. :)
5 svar · 431 visningar · startad av smyken
Hej
Jag har "anpassat" min datagrid en smula så att den visar två fält samtidigt i samma <ItemTemplate> respektive <EditItemTemplate> rad.
Men jag får felmeddelande när jag klickar på "Edit"-knappen:
"System.InvalidCastException: Specified cast is not valid."
Jag vet dock inte hur jag ska lösa detta (förutom att ändra datagriden). Orsaken till varför jag vill ha det så här är det för att jag vill ha cellerna så här:
_______
rubrik
text
______
istället för
__
rubrik | text
__
Min doUpdatemetod:
public void doUpdate(Object sender, DataGridCommandEventArgs e) {
string Rubrik = ((TextBox)e.Item.Cells[0].Controls[0]).Text;
string Text = ((TextBox)e.Item.Cells[0].Controls[0]).Text;
mygrid.EditItemIndex = -1;
DataSet ds = CreateDataSource();
DataRow row = ds.Tables[0].Rows[e.Item.ItemIndex];
row["rubrik"]=Rubrik;
row["huvudtext"]=Text;
ds.WriteXml(Server.MapPath("../../db/aktuellt.xml"));
mygrid.DataSource = CreateDataSource();
mygrid.DataBind();
}
Min datagrid:
<form runat="server">
<asp:datagrid id="mygrid" runat="server" AutoGenerateColumns="false"
OnUpdateCommand="doUpdate"
---
--- >
<Columns>
<asp:TemplateColumn>
<ItemTemplate>
<asp:Label Text='<%# DataBinder.Eval(Container.DataItem, "rubrik") %>' runat="server" />
<br /><br />
<asp:Label Text='<%# ((string)DataBinder.Eval(Container.DataItem, "huvudtext")).Replace("\n", "<br/>") %>' runat="server" />
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox id="Rubrik" Rows="1" Text='<%# DataBinder.Eval(Container.DataItem, "rubrik")%>' textMode="SingleLine" Columns="35" runat="server" />
<br /><br />
<asp:TextBox id="Huvudtext" Rows="15" Text='<%# DataBinder.Eval(Container.DataItem, "huvudtext")%>' textMode="multiLine" Columns="35" runat="server" />
</EditItemTemplate>
</asp:TemplateColumn>
<asp:EditCommandColumn CancelText="Ångra" EditText="Ändra" UpdateText="Uppdatera" ButtonType="PushButton" />
</Columns>
</asp:datagrid>
Kanske finns det nån annan metod för att uppnå detta?
// Smyken
Om du använder findcontrol då.
string Rubrik = ((TextBox)e.Item.findcontrol("Rubrik")).Text;
string Text = ((TextBox)e.Item.findcontrol("Huvudtext")).Text;
Välkommen till webForum. :)
Tack för tipset...
Nu fick jag dock ett annat felmeddelande:
'System.Web.UI.WebControls.DataGridItem' does not contain a definition for 'findcontrol'
Jag prövade att lägga till följande namnområde (trodde det hade nått med det att göra) men ingen hände:
<%@ import Namespace="System.Web.UI.WebControls" %>
Sen vart jag förstås nyfiken, vad är det för skillnad på de två sätten?
// Smyken
FindControl... case sensitive. :)
Ahhh.......
Jag lyfter på hatten. WebForum är chef......
/ Smyken
Sen vart jag förstås nyfiken, vad är det för skillnad på de två sätten?
När du använder ((TextBox)e.Item.Cells[0].Controls[0]).Text så anger du själv "vägen" till kontrollen... vilken cell den ligger i och vilken kontroll du vill ta fram. Problemet är att controls[0] inte alls är din textbox utan den ligger gissningsvis på index nummer 1. Första indexet är alltid en literal har jag för mig (denna används för eventuella styles). Med en findcontrol så letar den själv upp den eftersökta controllen, du slipper således göra det själv (med en liten omärkbar prestandaförlust som följd). Ska du själv plocka ut kontrollerna så är det lämpligt att du skriver ut kontrollen först så du vet vad det är för kontroll du har hittat:
Response.Write(e.Item.Cells[0].Controls[0]);
Är det en textbox så skriver den ut det och när du vet att du är rätt så kan du typkonvertera den och skriva ut dess text. Är det inte en textbox och du ändå typkonverterar den så blir det som sagt fel... Man får gräva lite helt enkelt, när man är varm i kläderna lär man sig ungefär var kontrollerna ligger (det går ju att räkna). Men findcontrol är smidigt. :)