webForumDet fria alternativet

Hur modifierar jag doUpdate-metoden så att den fungerar till min datagrid?

.NET

5 svar · 431 visningar · startad av smyken

Medlem sedan feb. 200336 inlägg
Frågan#1

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

Medlem sedan sep. 20011 914 inlägg
#2

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

Medlem sedan feb. 200336 inlägg
#3

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

Medlem sedan juni 20011 732 inlägg
#4

FindControl... case sensitive. :)

Medlem sedan feb. 200336 inlägg
#5

Ahhh.......
Jag lyfter på hatten. WebForum är chef......
/ Smyken

Medlem sedan juni 20011 732 inlägg
#6

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

256 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
125 ms — deklarationer (db)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)
124 ms — ändringar (db)