Hi Matthew,
You asked:
When I edit a row in a DataGrid, I want to filter the rows to a smaller set
when displaying it to the user in edit mode. How do I set
DataGrid1.EditItemIndex correctly after I change the set of rows?
---
If the DataView is sorted, then you can use DataView.Find(...). Otherwise,
iterate through the items in the DataView to find the one you want. Below
is a sample which uses iteration.
To change this sample to use Find, change the sort from "au_lname" to
"au_id". Then replace the code in the GetPosition function with: Return
Dv.Find(ID)
*** HTML
<asp

ataGrid id="DataGrid1" runat="server" AutoGenerateColumns="False">
<Columns>
<asp:EditCommandColumn ButtonType="LinkButton" UpdateText="Update"
CancelText="Cancel" EditText="Edit"></asp:EditCommandColumn>
<asp:BoundColumn DataField="au_id" ReadOnly="True"
HeaderText="ID"></asp:BoundColumn>
<asp:BoundColumn DataField="au_fname"
HeaderText="First"></asp:BoundColumn>
<asp:BoundColumn DataField="au_lname"
HeaderText="Last"></asp:BoundColumn>
</Columns>
</asp

ataGrid>
*** Code-behind
Imports System.Data.SqlClient
Const connString As String = "server='localhost'; trusted_connection=true;
Database='pubs'"
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
If Not IsPostBack Then
Bind(GetData(""))
End If
End Sub
Private Sub Bind(ByVal Dv As DataView)
DataGrid1.DataSource = Dv
DataGrid1.DataBind()
Dim i As Integer = 1
End Sub
Private Function GetData(ByVal Filter As String) As DataView
Dim ConnString As String = "server='localhost'; trusted_connection=true;
Database='pubs'"
Dim Conn As SqlConnection = New SqlConnection(ConnString)
Dim Qry As String = "SELECT au_id, au_fname, au_lname FROM authors"
Dim Cmd As SqlCommand = New SqlCommand(Qry, Conn)
Dim Adapter As New SqlDataAdapter(Cmd)
Dim Ds As New Data.DataSet
Adapter.Fill(Ds, "data")
Dim Dv As DataView = Ds.Tables("data").DefaultView
If Filter <> "" Then
Dv.RowFilter = Filter
End If
Dv.Sort = "au_lname"
Ds.Dispose()
Adapter.Dispose()
Cmd.Dispose()
Conn.Dispose()
Return Dv
End Function
Private Function GetPosition(ByVal Dv As DataView, ByVal ID As String) As
Integer
Dim i As Integer
Dim Found As Integer
Found = -1
For i = 0 To Dv.Count
If ID = Dv(i)("au_id") Then
Found = i
Exit For
End If
Next
Return Found
End Function
Private Sub DataGrid1_EditCommand(ByVal source As Object, ByVal e As
System.Web.UI.WebControls.DataGridCommandEventArgs) Handles
DataGrid1.EditCommand
Dim s As String = Left(e.Item.Cells(3).Text, 1)
Dim Dv As DataView = GetData("au_lname like '" & s & "%'")
DataGrid1.EditItemIndex = GetPosition(Dv, e.Item.Cells(1).Text)
Bind(Dv)
End Sub
Private Sub DataGrid1_CancelCommand(ByVal source As Object, ByVal e As
System.Web.UI.WebControls.DataGridCommandEventArgs) Handles
DataGrid1.CancelCommand
DataGrid1.EditItemIndex = -1
DataGrid1.SelectedIndex = -1
Bind(GetData(""))
End Sub
Private Sub DataGrid1_UpdateCommand(ByVal source As Object, ByVal e As
System.Web.UI.WebControls.DataGridCommandEventArgs) Handles
DataGrid1.UpdateCommand
DataGrid1.EditItemIndex = -1
DataGrid1.SelectedIndex = -1
Dim conn As SqlConnection = New SqlConnection(connString)
Dim queryString As String = "UPDATE authors SET au_fname=@First,
au_lname=@Last WHERE au_id=@ID"
Dim cmd As SqlCommand = New SqlCommand(queryString, conn)
Dim parm As SqlClient.SqlParameter
parm = New SqlClient.SqlParameter("@ID", SqlDbType.VarChar, 11)
parm.Value = e.Item.Cells(1).Text
cmd.Parameters.Add(parm)
parm = New SqlClient.SqlParameter("@First", SqlDbType.VarChar, 20)
parm.Value = CType(e.Item.Cells(2).Controls(0), TextBox).Text
cmd.Parameters.Add(parm)
parm = New SqlClient.SqlParameter("@Last", SqlDbType.VarChar, 40)
parm.Value = CType(e.Item.Cells(3).Controls(0), TextBox).Text
cmd.Parameters.Add(parm)
conn.Open()
cmd.ExecuteNonQuery()
cmd.Dispose()
conn.Dispose()
Bind(GetData(""))
End Sub
Thank you, Mike
Microsoft, ASP.NET Support Professional
Microsoft highly recommends to all of our customers that they visit the
http://www.microsoft.com/protect site and perform the three straightforward
steps listed to improve your computer’s security.
This posting is provided "AS IS", with no warranties, and confers no rights.