53 messaggi dal 26 luglio 2004
All'interno di un DetailView ho un bottone che dovrebbe, quando viene premuto, provocare un'operazione di insert in un SqlDataSource.
Se tengo il bottone fuori dal controllo DetailView non ho problemi mentre quando lo metto all'interno ho errore, vi posto il codice con il relativo errore che ottento.
Grazie a tutti per l'attenzione.


<asp:DetailsView .....>
<Fields>
<asp:TemplateField HeaderText="">
<ItemTemplate>
<asp:Button ID="Button1" runat="server" Text="Inserisci" />
</ItemTemplate>
</asp:TemplateField>
</Fields>
</asp:DetailsView>


Nel code behind ho:
Protected Sub Button1_Click1(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
SqlDataSource1.Insert()
End Sub

E ottengo come errore:
error BC30506: Handles clause requires a WithEvents variable defined in the containing type or one of its base types.
l'evento del bottone viene gestito direttamente dal GridView.

intercetta l'evento GridView.RowCommand

assegnando un CommandName e un CommandArgument al bottone li puoi poi recuperare facilmente.

ciao marco

Chi parla senza modestia troverà difficile rendere buone le proprie parole.
Confucio

http://nostromo.spaces.live.com/default.aspx
53 messaggi dal 26 luglio 2004
grazie, ho capito la strada da seguire.
Come mi hai indicato riesco a fargli eseguire delle istruzioni quando viene premuto il bottone.

Mi chiedevo se è possibile intercettare i valori che sono contenuti nella DetailView.
Per esempio la detalView contiene un:

<asp:BoundField DataField="titolo" HeaderText="titolo" SortExpression="titolo" />

ora vorrei che quando viene premuto il bottone di prima passo al comando insert del datasource come parametro il valore del BoundField Titolo, è possibile?
Cioè quando intercetto la pressione del pulsante e lancio:
SqlDataSource1.insert()
come faccio a passargli come parametro il contenuto del campo titolo?
devi impostare la collezione Parameters del DqlDataSource

qualcosa di simile a questo


<asp:sqlDataSource ID="EmployeeDetailsSqlDataSource" 
  SelectCommand="SELECT EmployeeID, LastName, FirstName FROM Employees WHERE EmployeeID = @EmpID"

  InsertCommand="INSERT INTO Employees(LastName, FirstName) VALUES (@LastName, @FirstName); 
                 SELECT @EmpID = SCOPE_IDENTITY()"
  UpdateCommand="UPDATE Employees SET LastName=@LastName, FirstName=@FirstName 
                   WHERE EmployeeID=@EmployeeID"
  DeleteCommand="DELETE Employees WHERE EmployeeID=@EmployeeID"

  ConnectionString="<%$ ConnectionStrings:NorthwindConnection %>"
  OnInserted="EmployeeDetailsSqlDataSource_OnInserted"
  RunAt="server">
  
  <SelectParameters>
    <asp:Parameter Name="EmpID" Type="Int32" DefaultValue="0" />
  </SelectParameters>
  
  <InsertParameters>
    <asp:Parameter Name="EmpID" Direction="Output" Type="Int32" DefaultValue="0" />
  </InsertParameters>

</asp:sqlDataSource>



EmpID è il nome della tua BoundField

ciao marco

Chi parla senza modestia troverà difficile rendere buone le proprie parole.
Confucio

http://nostromo.spaces.live.com/default.aspx
53 messaggi dal 26 luglio 2004
ho capito il metodo però non memorizza il valore corretto deò parametro.
Non ho errore però anzichè il valore che c'è nel BoundField mi inserisce nel database il valore di default del parametro.

Pracicamente ho:
<asp:DetailsView ..... >
<Fields>
<asp:BoundField DataField="titolo" HeaderText="titolo" SortExpression="titolo" />
</Fields>
</asp:DetailsView>

con questo SqlDataSource:

<asp:SqlDataSource ......
InsertCommand="INSERT INTO tabella(titolo) VALUES (@titolo)">
<InsertParameters>
<asp:Parameter Name="titolo" Type="String" DefaultValue="prova" />
</InsertParameters>

e mi inserisce sempre il valore di default "prova" in realtà il campo titolo contiene un'altra stringa

Il comando di inserimento lo do intercettando l'evento ItemCommand del DetailView e facendo
SqlDataSource1.Insert():

Ho provato un'altra strada mettendo come parametro
<asp:ControlParameter ControlID="DetailsView1" Name="titolo" PropertyName="SelectedValue" />
questo funziona solo se metto come DataKey del DetailView il campo titolo ma se già (come dovrei fare) ho più campi da aggiornare e metto più valori nel DataKey ad esempio Titolo, autore, etc con la proprietà SelectedValue accedo solo alla prima chiave e non riesco a recuperare gli altri



Grazie per la pazienza!!
solo adesso mi soffiviene alla mente che il WebControl DetailView (mi ero confuso con il GridView) ha una proprietà AutoGenerateInsertButton pensata a questo scopo.

tra l'altro non hai poi nemmeno bisogno di specificare i parametri fa tutto il DetailView

ciao marco

Chi parla senza modestia troverà difficile rendere buone le proprie parole.
Confucio

http://nostromo.spaces.live.com/default.aspx
53 messaggi dal 26 luglio 2004
con quel metodo riesco a gestire l'inserimento, in questo caso però stavo cercando un'altra strada perchè se metto in DetailView in modalità Insert mi trovo tutti i campi vuoti e devo compilarli, invece mi trovo in una situazione di vista Master/Detail in cui il DetailView visualizza dei campi con già dentro dei valori. A questo punto però devo integrare questi valori con altri presi ad esempio da una TextBox o da una dropdownList e quindi lanciare la query di inserimento in cui uso sia i valori con cui è stato caricato il DetailView sia quelli che ho compilato successivamente
puoi gestire tranquillamentel'aspetto del DetailView in fase di inserimento, mettendo dentro l' EditTemplate i controlli di cui necessiti.

ciao marco

Chi parla senza modestia troverà difficile rendere buone le proprie parole.
Confucio

http://nostromo.spaces.live.com/default.aspx

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.