2012-12-24 15 views
6

Sto cercando di integrare CKEditor con una vista dettagli. Il mio codice di esempio è:Integrazione di CKEditor in un detailsView in ASP.NET utilizzando VB.NET

<asp:DetailsView ID="DetailsViewStation" runat="server" Height="50px" AutoGenerateRows="False" 
        DataKeyNames="StationNo" DataSourceID="StationSqlDataSource" CellPadding="4" 
        ForeColor="#333333" GridLines="None"> 
        <AlternatingRowStyle BackColor="White" /> 
        <CommandRowStyle BackColor="#FFFFC0" Font-Bold="True" /> 
        <FieldHeaderStyle BackColor="#FFFF99" Font-Bold="True" /> 
        <Fields> 
         <asp:BoundField DataField="StationNo" HeaderText="Station Number" ReadOnly="True" 
          SortExpression="StationNo" ApplyFormatInEditMode="True"> 
          <HeaderStyle Width="150px" /> 
          <ItemStyle HorizontalAlign="Center" Width="1200px" /> 
         </asp:BoundField> 
         <asp:BoundField DataField="Station_Name" HeaderText="Station Name" SortExpression="Station_Name"> 
          <ItemStyle HorizontalAlign="Center" /> 
         </asp:BoundField> 
        </Fields> 
        <FooterStyle BackColor="#990000" Font-Bold="True" ForeColor="White" /> 
        <HeaderStyle BackColor="#990000" Font-Bold="True" ForeColor="White" /> 
        <PagerStyle BackColor="#FFCC66" ForeColor="#333333" HorizontalAlign="Center" /> 
        <RowStyle BackColor="#FFFBD6" ForeColor="#333333" /> 
       </asp:DetailsView> 
       <asp:SqlDataSource ID="StationSqlDataSource" runat="server" ConnectionString="<%$ ConnectionStrings:AgainConnectionString %>" 
        DeleteCommand="DELETE FROM [StationInfoTable] WHERE [StationNo] = @StationNo" 
        InsertCommand="INSERT INTO [StationInfoTable] ([StationNo], [Station_Name] VALUES (@StationNo, @Station_Name)" 
        SelectCommand="SELECT * FROM [StationInfoTable] WHERE ([StationNo] = @StationNo)" 
        UpdateCommand="UPDATE [StationInfoTable] SET [Station_Name] = @Station_Name, [Importatnat_Info] = @Importatnat_Info WHERE [StationNo] = @StationNo"> 
        <DeleteParameters> 
         <asp:Parameter Name="StationNo" Type="Int32" /> 
        </DeleteParameters> 
        <InsertParameters> 
         <asp:Parameter Name="StationNo" Type="Int32" /> 
         <asp:Parameter Name="Station_Name" Type="String" /> 
        </InsertParameters> 
        <SelectParameters> 
         <asp:ControlParameter ControlID="ListBoxChoices" Name="StationNo" PropertyName="SelectedValue" 
          Type="Int32" /> 
        </SelectParameters> 
        <UpdateParameters> 
         <asp:Parameter Name="Station_Name" Type="String" /> 
         <asp:Parameter Name="StationNo" Type="Int32" /> 
        </UpdateParameters> 
       </asp:SqlDataSource> 

Voglio modificare i dati in vista dettagli con CKEditor per inserire ed eliminare i collegamenti da e verso database. Qualcuno l'ha già fatto prima?

+0

Ciao, @Ahmed. 'ImportantInfo' è il campo che vuoi modificare? In caso contrario, che campo vuoi modificare? –

+0

Il database è più grande del mio codice sopra. Ho rimosso i campi da esso per essere più facile da capire.ma per il codice di cui sopra voglio modificare il campo Station_Name. – Ahmed

+0

Quindi stai usando la vista Dettagli in modo da avere i link Modifica ed Elimina sui singoli record? Ho ragione? –

risposta

5

Non sono un esperto di DetailsView, ma penso che il seguente riepilogo generale comprenda ciò che è necessario fare.

Utilizzare uno TemplateField anziché uno BoundField per Station_Name. Ciò sarebbe simile a questa:

<asp:TemplateField HeaderText="Station Name"> 
    <ItemTemplate> 
      <asp:Label ID="lblStationName" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.Station_Name") %>'></asp:Label> 
    </ItemTemplate> 
    <EditItemTemplate> 
      <CKEditor:CKEditorControl ID="CKEditor1" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.Station_Name") %>' /> 
    </EditItemTemplate> 
</asp:TemplateField> 

This è quello che sembra un buon collegamento sull'aggiornamento del database da un DetailsView. Dove la tua situazione è diversa da quella che stai usando CKEditor. Ma è possibile recuperare le informazioni dal controllo CKEditor allo stesso modo lo fa, quando sarà pronto ad aggiornare:

Dim htmlText as String = Nothing 
Dim ctl as CKEditor = CType(DetailsViewStation.FindControl("CKEditor1"), CKEditor) 
If ctl Is Nothing Then 
    htmlText = ctl.Text 
End If 

Se si scopre che non è possibile associare alla proprietà Text del controllo CKEditor, si dovrebbe assegnare il valore allo CKEditor. Controllo Text nello stesso modo in cui lo si recupera: facendo un DetailsViewStation.FindControl("CKEditor1") per recuperare il controllo e assegnando l'HTML che si è recuperato dal database alla proprietà Text del controllo.

Spero che questo aiuti.

+0

Spiacente, puoi scrivere il codice usando VB.NET per favore. grazie – Ahmed

+0

OK, dovrebbe farlo. A proposito, potresti trovare molto utile questo sito: http://www.developerfusion.com/tools/convert/csharp-to-vb/ –

+0

non funziona. Ho un errore dopo aver cambiato il BoundField in TemplateField. Quindi, questo significa che non dovrei usare detailsView se sì in che modo stai usando? – Ahmed

4

In base ai commenti che hai fatto, non si recupera mai il valore da Textbox/CKEditor.

L'associazione è di sola lettura a causa di DataBinder.Eval.

Prova

  <asp:TemplateField HeaderText="Station Name"> 
         <ItemTemplate> 
          <asp:Label ID="lblStation_Name" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.Station_Name") %>'></asp:Label> 
         </ItemTemplate> 
         <EditItemTemplate> 
          <CKEditor:CKEditorControl ID="CKEditor1" runat="server" Text='<%# Bind("Station_Name") %>' /> 
         </EditItemTemplate> 
        </asp:TemplateField> 

o

  <asp:TemplateField HeaderText="Station Name"> 
         <ItemTemplate> 
          <asp:Label ID="lblStation_Name" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.Station_Name") %>'></asp:Label> 
         </ItemTemplate> 
         <EditItemTemplate> 
          <CKEditor:CKEditorControl ID="CKEditor1" runat="server" Text='<%# DataBinder.Bind(Container, "DataItem.Station_Name") %>' /> 
         </EditItemTemplate> 
        </asp:TemplateField> 

Edit: Sulla base di tuo commento: Come hai generare lo SQLDataSource? È meglio usare il designer. Immagino tu abbia provato a generare il codice da solo. Vedo più errori:

In UpdateParameters si utilizzano ControlParameters, ma i valori sono errati. I valori assegnati a Control control devono essere assegnati a PropertyName. Quindi assegnare a ControlID il nome del CKEditor corrispondente.

Ti piace questa:

<asp:ControlParameter ControlID="CKEditor12" PropertyName="Footer_notes" Type="String" /> 
+0

Hey Citronas, ho cambiato eval in Bind e il programma ha avuto molti errori. Quindi, ho rimosso dataBinder e lasciato solo Bind, lo eseguo e ho questo errore: Impossibile trovare il controllo 'CKEditor1' in ControlParameter 'Station_Name'. – Ahmed

+0

Ho aggiornato la mia risposta – citronas

+0

La mia risposta non è stata utile? – citronas

2

Il seguente codice è dopo integrato CKEditor con DetailsView e ho messo la risposta qui per essere chiari per gli altri a leggerlo e trarne beneficio. Tutto è lo stesso eccetto il campo Note che volevo usare CKEditor per poter inserire i collegamenti ipertestuali nel database.

<asp:TemplateField HeaderText="Notes"> 
          <ItemTemplate> 
           <asp:Label ID="lblStationNotes" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.Notes") %>'></asp:Label> 
          </ItemTemplate> 
          <EditItemTemplate> 
           <CKEditor:CKEditorControl ID="CKEditor11" runat="server" Text='<%# Bind("Notes") %>' /> 
          </EditItemTemplate> 
         </asp:TemplateField> 
Problemi correlati