Avatar billede basementjack Nybegynder
12. august 2004 - 16:40 Der er 11 kommentarer og
1 løsning

Editable datagrid

Jeg har været inde på http://samples.gotdotnet.com/quickstart/aspplus/samples/webforms/ctrlref/webctrl/datagrid/doc_datagrid.aspx og har fundet et datagrid der passer til mit formål(datagrid6.aspx).. Nu har jeg oversat den så jeg kunne teste om det fungerer med min db.
(koden følger som næste indlæg)
Det der er i ContentText og ContentHead er html, og når update køres bliver kun første linie gemt i db igen.. Ved ikke om det er fordi at textboxe per automatik er singleline eller om det er noget andet, men jeg vil gerne have en eller anden til at fortælle mig hvordan jeg kan komme til at gemme mit html som altså er multilinie..
På forhånd tak Basementjack.
Avatar billede basementjack Nybegynder
12. august 2004 - 16:40 #1
<%@ Page Language="vb" validaterequest="false" %>
<%@ import Namespace="System.Data" %>
<script runat="server">

    Sub Page_Load(sender As Object, e As EventArgs)
        If Not IsPostBack Then
            ' need to load this data only once
            BindGrid
        End If
   
    End Sub
   
    Sub MyDataGrid_Edit(sender As Object, e As DataGridCommandEventArgs)
        MyDataGrid.EditItemIndex = e.Item.ItemIndex
        BindGrid
    End Sub
   
    Sub MyDataGrid_Cancel(sender As Object, e As DataGridCommandEventArgs)
        MyDataGrid.EditItemIndex = -1
        BindGrid
    End Sub
   
    Sub MyDataGrid_Update(sender As Object, e As DataGridCommandEventArgs)
        ' For bound columns the edited value is stored in a textbox,
        ' and the textbox is the 0th element in the column's cell
        Dim Head As TextBox = e.Item.Cells(2).Controls(0)
        Dim text As TextBox = e.Item.Cells(3).Controls(0)
   
        Dim txtId As String = e.Item.Cells(1).Text
        'Dim txtHead As String = Head.Text
        'Dim txtText As String = text.Text
   
        ' with a database, we'd use an update command.  Since we're using an in-memory
        ' DataTable, we'll delete the old row and replace it with a new one
        ' remove old entry
        Dim sql As String
        sql = "UPDATE Content SET ContentHead = '" & head.text & "', ContentText = '" & text.text & "' WHERE ContentID = " & txtId & ";"
        changeData(sql)
   
        MyDataGrid.EditItemIndex = -1
        BindGrid
    End Sub
   
    Sub BindGrid()
        MyDataGrid.DataSource = showData("SELECT * FROM Content")
        MyDataGrid.DataBind
    End Sub
   
    Function showData(sql As String)
          Try
              Dim connectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0; Ole DB Services=-4; Data Source=" & Server.Mappath("test.mdb.ressources") & ";"
            Dim dbConnection As System.Data.IDbConnection = New System.Data.OleDb.OleDbConnection(connectionString)
            Dim dbCommand As System.Data.IDbCommand = New System.Data.OleDb.OleDbCommand
            dbCommand.CommandText = sql
            dbCommand.Connection = dbConnection
            Dim dataAdapter As System.Data.IDbDataAdapter = New System.Data.OleDb.OleDbDataAdapter
            dataAdapter.SelectCommand = dbCommand
            Dim dataSet As System.Data.DataSet = New System.Data.DataSet
            dataAdapter.Fill(dataSet)
            Return dataSet
        Catch
          End Try
      End Function
   
    Sub changeData(sql As String)
          Try
              Dim connectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0; Ole DB Services=-4; Data Source=" & Server.Mappath("test.mdb.ressources") & ";"
            Dim dbConnection As System.Data.IDbConnection = New System.Data.OleDb.OleDbConnection(connectionString)
            Dim dbCommand As System.Data.IDbCommand = New System.Data.OleDb.OleDbCommand
            dbCommand.CommandText = sql
            dbCommand.Connection = dbConnection
              dbConnection = New System.Data.OleDb.OleDbConnection(connectionString)
              dbConnection.Open()
            dbCommand = New System.Data.OleDb.OleDbCommand(sql, dbConnection)
              dbCommand.ExecuteNonQuery()
              dbConnection.Close()
        Catch
          End Try
      End Sub

</script>
<html>
<body style="font: 10pt verdana">

  <form runat="server">

    <h3><font face="Verdana">Using an Edit Command Column in DataGrid</font></h3>

    <asp:DataGrid id="MyDataGrid" runat="server"
        BorderColor="black"
        BorderWidth="1"
        CellPadding="3"
        Font-Name="Verdana"
        Font-Size="8pt"
        HeaderStyle-BackColor="#aaaadd"
        OnEditCommand="MyDataGrid_Edit"
        OnCancelCommand="MyDataGrid_Cancel"
        OnUpdateCommand="MyDataGrid_Update"
        AutoGenerateColumns="false"
        >

        <Columns>
            <asp:EditCommandColumn
                EditText="Edit"
                CancelText="Cancel"
                UpdateText="Update"
                ItemStyle-Wrap="false"
                HeaderText="Edit Command Column"
                HeaderStyle-Wrap="false"
                />
            <asp:BoundColumn HeaderText="Id" ReadOnly="true" DataField="ContentID"/>
            <asp:BoundColumn HeaderText="Head" DataField="ContentHead"/>
            <asp:BoundColumn HeaderText="Text" DataField="ContentText"/>
        </Columns>
    </asp:DataGrid>

  </form>

</body>
</html>
Avatar billede snepnet Nybegynder
13. august 2004 - 00:35 #2
for h.... jeg synes det er tit det man har skrevet forsvinder når man poster.
jeg skrev noget til dig her tidligere i aftes, men det er så væk :o)

nå... men hvis du vil have en multiline textbox ved editering (eller i det hele taget noget andet end en helt almindelig tekstboks), kan du gøre det sådan her :

<asp:DataGrid id="dg" runat="server" AutoGenerateColumns="False">
    <Columns>
        <asp:TemplateColumn HeaderText="Something">
            <ItemTemplate>
                <asp:Label id=lblHeader runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.Something") %>'>
                </asp:Label>
            </ItemTemplate>
            <EditItemTemplate>
                <asp:TextBox id=tbSomething runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.Something") %>' TextMode="MultiLine">
                </asp:TextBox>
            </EditItemTemplate>
        </asp:TemplateColumn>
    </Columns>
</asp:DataGrid>

Du definerer bare en template for når rækken er editerbar, og når den ikke er det.

Nu er det så bare et eksempel, hvor griddet ikke viser mere end en enkelt kolonne, men jeg håber du kan overføre princippet.

Mvh
Avatar billede basementjack Nybegynder
13. august 2004 - 00:39 #3
Mange tak.. ( Tænkte nok der var noget i vejen, det er nemlig det længeste jeg har ventet på respons på et konkret problem her på exp... Men 8 timer det er stadig hurtigere end jeg selv kunne klare det.. :P )
Prøver at overføre det i morgen.. Det er tid til noget søvn.. :)
Avatar billede snepnet Nybegynder
13. august 2004 - 00:58 #4
ok - jeg håber du får det til at trille, ellers skriver du bare igen :o)
Mvh
Avatar billede basementjack Nybegynder
13. august 2004 - 10:32 #5
Okay.. Der kommer en mulitline textbox frem, ved klik på edit nu.. og der sker intet ved klik på cancel, som der skal.. :) Men ved klik på update, får jeg en fejl der hedder :
System.InvalidCastException: Specified cast is not valid.
På linien : Dim text As TextBox = e.Item.Cells(3).Controls(0)
Avatar billede snepnet Nybegynder
13. august 2004 - 10:48 #6
det tyder så på at din Cells[3].Controls[0] ikke er en tekstbox... prøv at vis din aspx som den ser ud nu.
Avatar billede basementjack Nybegynder
13. august 2004 - 10:52 #7
<%@ Page Language="vb" debug="true" validaterequest="false" %>
<%@ import Namespace="System.Data" %>
<script runat="server">

    Sub Page_Load(sender As Object, e As EventArgs)
        If Not IsPostBack Then
            ' need to load this data only once
            BindGrid
        End If

    End Sub

    Sub MyDataGrid_Edit(sender As Object, e As DataGridCommandEventArgs)
        MyDataGrid.EditItemIndex = e.Item.ItemIndex
        BindGrid
    End Sub

    Sub MyDataGrid_Cancel(sender As Object, e As DataGridCommandEventArgs)
        MyDataGrid.EditItemIndex = -1
        BindGrid
    End Sub

    Sub MyDataGrid_Update(sender As Object, e As DataGridCommandEventArgs)
        ' For bound columns the edited value is stored in a textbox,
        ' and the textbox is the 0th element in the column's cell
        Dim Head As TextBox = e.Item.Cells(2).Controls(0)
        Dim text As TextBox = e.Item.Cells(3).Controls(0)

        Dim txtId As String = e.Item.Cells(1).Text
        'Dim txtHead As String = Head.Text
        'Dim txtText As String = text.Text

        ' with a database, we'd use an update command.  Since we're using an in-memory
        ' DataTable, we'll delete the old row and replace it with a new one
        ' remove old entry
        Dim sql As String
        sql = "UPDATE Content SET ContentHead = '" & head.text & "', ContentText = '" & text.text & "' WHERE ContentID = " & txtId & ";"
        changeData(sql)

        MyDataGrid.EditItemIndex = -1
        BindGrid
    End Sub

    Sub BindGrid()
        MyDataGrid.DataSource = showData("SELECT * FROM Content")
        MyDataGrid.DataBind
    End Sub

    Function showData(sql As String)
          Try
              Dim connectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0; Ole DB Services=-4; Data Source=" & Server.Mappath("test.mdb.ressources") & ";"
            Dim dbConnection As System.Data.IDbConnection = New System.Data.OleDb.OleDbConnection(connectionString)
            Dim dbCommand As System.Data.IDbCommand = New System.Data.OleDb.OleDbCommand
            dbCommand.CommandText = sql
            dbCommand.Connection = dbConnection
            Dim dataAdapter As System.Data.IDbDataAdapter = New System.Data.OleDb.OleDbDataAdapter
            dataAdapter.SelectCommand = dbCommand
            Dim dataSet As System.Data.DataSet = New System.Data.DataSet
            dataAdapter.Fill(dataSet)
            Return dataSet
        Catch
          End Try
      End Function

    Sub changeData(sql As String)
          Try
              Dim connectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0; Ole DB Services=-4; Data Source=" & Server.Mappath("test.mdb.ressources") & ";"
            Dim dbConnection As System.Data.IDbConnection = New System.Data.OleDb.OleDbConnection(connectionString)
            Dim dbCommand As System.Data.IDbCommand = New System.Data.OleDb.OleDbCommand
            dbCommand.CommandText = sql
            dbCommand.Connection = dbConnection
              dbConnection = New System.Data.OleDb.OleDbConnection(connectionString)
              dbConnection.Open()
            dbCommand = New System.Data.OleDb.OleDbCommand(sql, dbConnection)
              dbCommand.ExecuteNonQuery()
              dbConnection.Close()
        Catch
          End Try
      End Sub

</script>
<html>
<body style="font: 10pt verdana">

  <form runat="server">

    <h3><font face="Verdana">Using an Edit Command Column in DataGrid</font></h3>

    <asp:DataGrid id="MyDataGrid" runat="server"
        BorderColor="black"
        BorderWidth="1"
        CellPadding="3"
        Font-Name="Verdana"
        Font-Size="8pt"
        HeaderStyle-BackColor="#aaaadd"
        OnEditCommand="MyDataGrid_Edit"
        OnCancelCommand="MyDataGrid_Cancel"
        OnUpdateCommand="MyDataGrid_Update"
        AutoGenerateColumns="false"
        >

        <Columns>
            <asp:EditCommandColumn
                EditText="Edit"
                CancelText="Cancel"
                UpdateText="Update"
                ItemStyle-Wrap="false"
                HeaderText="Edit Command Column"
                HeaderStyle-Wrap="false"
                />
            <asp:BoundColumn HeaderText="Id" ReadOnly="true" DataField="ContentID"/>
            <asp:BoundColumn HeaderText="Head" DataField="ContentHead"/>
            <asp:TemplateColumn HeaderText="Text">
                <ItemTemplate>
                    <asp:Label id=lblHeader runat="server" Text='<%# Container.DataItem("ContentText") %>'>
                    </asp:Label>
                </ItemTemplate>
                <EditItemTemplate>
                    <asp:TextBox id=tbSomething runat="server" Text='<%# Container.DataItem("ContentText") %>' TextMode="MultiLine">
                    </asp:TextBox>
                </EditItemTemplate>
            </asp:TemplateColumn>
        </Columns>
    </asp:DataGrid>
  </form>

</body>
</html>
Avatar billede snepnet Nybegynder
13. august 2004 - 11:00 #8
Jeg synes du skal give din teksbox et id, og finde den med e.Item.FindControl(<string:id>) istedet.
Det er lidt irreterende at skulle ændre sine index rundt omkring i koden hver gang man finder på at rette lidt i hvordan det ser ud.
Avatar billede basementjack Nybegynder
13. august 2004 - 11:01 #9
Okay.. Will do.. Men det er ikke fordi at ItemTemplate er en label, vel?..
Avatar billede snepnet Nybegynder
13. august 2004 - 11:35 #10
Når du har sat dit edititemindex, skulle rækken gerne renderes i forhold til edititemtemplate, hvor der så er angivet en tekstboks, og du skal så helst sikre at du ikke prøver at caste til textbox, når det bare en en normal række du "kigger" på.
Avatar billede basementjack Nybegynder
13. august 2004 - 11:50 #11
Forstår ikke helt det sidste du siger.. Men det med e.Item.FindControl(<string:id>) virkede i hvert fald.. Så det kører nu.. Læg et svar. :)
Avatar billede snepnet Nybegynder
13. august 2004 - 11:58 #12
ok :o)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester