12. august 2004 - 16:40Der 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.
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
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 :
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.. :)
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)
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
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.
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å.
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.