Я использую GridView в своем приложении для заполнения данных.
Есть ли простой способ скопировать gridview в datatable?
Собственно, в моем GridView одним из элементов управления является текстовое поле.
Так что я могу редактировать этот элемент управления в любое время ... Мне нужно щелкнуть по кнопке все изменения, которые я внес в GridView, которые нужно скопировать в одну таблицу данных ...
Я сделал это с помощью кода,
dt = CType(Session("tempTable"), DataTable)
i = 0 For Each rows As GridViewRow In Grid1.Rows
Dim txt As TextBox
txt = CType(rows.FindControl("txt"), TextBox)
dt.Rows(i)(1) = txt.Text
i = i + 1
Next
Здесь я прохожу по сетке с помощью цикла "для каждого".
Меня беспокоит, влияет ли это на производительность?
Не могли бы вы назвать мне любой другой простой способ скопировать GridView в datatable?





Предпочтительным способом было бы использовать привязку данных. Если вам удастся заставить работать двунаправленную привязку данных, ваш DataTable обновится автоматически.
С точки зрения производительности вы, вероятно, получите максимальную скорость из динамически сгенерированной таблицы, в которой ваши текстовые поля имеют идентификатор, который вы можете легко интерпретировать при обратной передаче и сохранять свои изменения, без использования GridView для использования ViewState или восстановления его состояния и запуска всех событий.
Вы можете привязать данные к GridView, вы можете редактировать по одной записи за раз. По сути, после редактирования каждой строки ее необходимо сохранить, прежде чем можно будет редактировать другую строку. Хорошая отправная точка: msdn.microsoft.com/en-us/magazine/cc163933.aspx
привет ... На самом деле в моей таблице у меня есть 3 строки .. этого 1-го столбца является текстовое поле, поэтому я могу редактировать все три строки, прежде чем нажать кнопку сохранения ... ссылка, которую вы отправляете, предназначена только для редактирования одной строки в время ... спасибо за ваше время ... я исправил это, используя два сеанса ...
Что вы имеете в виду под двумя сеансами?
при загрузке страницы я сохранил исходные значения сетки в сеансе. а затем, нажав кнопку сохранения, я снова прочитал сетку и сохранил ее в другом сеансе, после чего я сравнил новый сеанс со старым сеансом. если произойдет какое-либо изменение, то только это значение будет сохранено в базе данных.
я отправил один пример, чтобы сделать это
html-страница выглядит так,
<asp:GridView ID = "Grid1" runat = "server" AutoGenerateColumns = "False" GridLines = "None">
<Columns>
<asp:TemplateField HeaderText = "ID">
<ItemTemplate>
<asp:Label ID = "lbl1" runat = "server" Text='<%#Bind("ID") %>' CssClass = "rowHeader"></asp:Label>
</ItemTemplate>
<FooterTemplate>
<asp:TextBox ID = "txt1" runat = "server" Text='<%#Bind("ID") %>'></asp:TextBox>
</FooterTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText = "Description">
<ItemTemplate>
<asp:TextBox ID = "txt" runat = "server" Text='<%#Bind("Description") %>'></asp:TextBox>
</ItemTemplate>
<FooterTemplate>
<asp:TextBox ID = "txt2" runat = "server" Text='<%#Bind("Description") %>'></asp:TextBox>
</FooterTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText = "Comments">
<ItemTemplate>
<asp:Label ID = "Comments" runat = "server" Text='<%#Bind("Comments") %>'></asp:Label>
</ItemTemplate>
<FooterTemplate>
<asp:DropDownList ID = "Drop1" runat = "server">
<asp:ListItem>v1</asp:ListItem>
<asp:ListItem>v2</asp:ListItem>
</asp:DropDownList>
</FooterTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<asp:Button ID = "btnAdd" runat = "server" Text = "Add" />
<asp:Button ID = "btnSave" runat = "server" Text = "Save" />
при загрузке страницы,
conn = New OleDb.OleDbConnection ("Provider = Microsoft.Jet.OLEDB.4.0; Data Source = D: \ GDD_Work \ Employee.mdb")
If Not Page.IsPostBack Then
ViewState("intCount") = 0
Session("blnFlag") = False
Dim Cmd As New OleDb.OleDbDataAdapter("Select * from Emp", conn)
Cmd.Fill(ds, "Employee")
Grid1.DataSource = ds.Tables("Employee")
Grid1.DataBind()
Session("intOldCount") = ds.Tables("Employee").Rows.Count
Session("tempTable") = ds.Tables("Employee")
при нажатии кнопки добавления,
Если Session ("blnFlag") = False, то Сессия ("blnFlag") = True Еще getFooter () Конец, если
Grid1.FooterRow.Visible = True
при нажатии кнопки сохранения,
Dim intOldCount как целое число Dim intNewCount как целое число Dim dt как новая таблица данных Dim strQuery As String intOldCount = CType (Сеанс ("intOldCount"), Целое число) Если Session ("blnFlag") = True, то
getFooter()
dt = CType(Session("tempTable"), DataTable)
intNewCount = dt.Rows.Count
If intOldCount = intNewCount Then
Dim tx1 As TextBox
Dim tx2 As TextBox
Dim drp As DropDownList
tx1 = CType(Grid1.FooterRow.FindControl("txt1"), TextBox)
tx2 = CType(Grid1.FooterRow.FindControl("txt2"), TextBox)
drp = CType(Grid1.FooterRow.FindControl("Drop1"), DropDownList)
strQuery = "INSERT INTO Emp (ID,Description,Comments) values ('" + tx1.Text + "','" + tx2.Text + "','" + drp.SelectedValue + "')"
Dim Cmd As New OleDb.OleDbCommand(strQuery, conn)
conn.Open()
Cmd.ExecuteNonQuery()
conn.Close()
Else
For i = intOldCount To intNewCount - 1
Dim strId As String
Dim strDesc As String
Dim strComm As String
strId = dt.Rows(i)(0).ToString()
strDesc = dt.Rows(i)(1).ToString()
strComm = dt.Rows(i)(2).ToString()
strQuery = "INSERT INTO Emp (ID,Description,Comments) values ('" + strId + "','" + strDesc + "','" + strComm + "')"
Dim Cmd As New OleDb.OleDbCommand(strQuery, conn)
conn.Open()
Cmd.ExecuteNonQuery()
conn.Close()
Next
End If
For i = 0 To intOldCount - 1
Dim strId As String
Dim strDesc As String
strId = dt.Rows(i)(0).ToString()
strDesc = dt.Rows(i)(1).ToString()
strQuery = "update Emp set Description = '" + strDesc + "' where ID = '" + strId + "'"
Dim Cmd1 As New OleDb.OleDbCommand(strQuery, conn)
conn.Open()
Cmd1.ExecuteNonQuery()
conn.Close()
Next
ds = New DataSet()
Dim CmdData As New OleDb.OleDbDataAdapter("Select * from Emp", conn)
CmdData.Fill(ds, "Employee")
Grid1.DataSource = ds.Tables("Employee").DefaultView
Grid1.DataBind()
Session("blnFlag") = False
Else
dt = CType(Session("tempTable"), DataTable)
i = 0
For Each rows As GridViewRow In Grid1.Rows
Dim txt As TextBox
txt = CType(rows.FindControl("txt"), TextBox)
dt.Rows(i)(1) = txt.Text
i = i + 1
Next
Session("tempTable") = dt
For i = 0 To intOldCount - 1
Dim strId As String
Dim strDesc As String
strId = dt.Rows(i)(0).ToString()
strDesc = dt.Rows(i)(1).ToString()
strQuery = "update Emp set Description = '" + strDesc + "' where ID = '" + strId + "'"
Dim Cmd1 As New OleDb.OleDbCommand(strQuery, conn)
conn.Open()
Cmd1.ExecuteNonQuery()
conn.Close()
Next
Grid1.DataSource = dt.DefaultView
Grid1.DataBind()
End If
Я использую одну функцию, например,
Открытая функция getFooter () Dim tx1 как текстовое поле Dim tx2 как текстовое поле Dim drp как DropDownList tx1 = CType (Grid1.FooterRow.FindControl ("txt1"), TextBox) tx2 = CType (Grid1.FooterRow.FindControl ("txt2"), TextBox) drp = CType (Grid1.FooterRow.FindControl ("Drop1"), DropDownList)
Dim dr As DataRow
Dim dt As DataTable
dt = CType(Session("tempTable"), DataTable)
dr = dt.NewRow()
dr("ID") = tx1.Text
dr("Description") = tx2.Text
dr("Comments") = drp.SelectedValue
dt.Rows.Add(dr)
i = 0
For Each rows As GridViewRow In Grid1.Rows
Dim txt As TextBox
txt = CType(rows.FindControl("txt"), TextBox)
dt.Rows(i)(1) = txt.Text
i = i + 1
Next
Grid1.DataSource = dt.DefaultView
Grid1.DataBind()
Session("tempTable") = dt
End Function
как редактировать данные в gridview с использованием набора данных и данных без источника данных
я дал программу выше ... проверьте предыдущий ответ ... мы можем редактировать сетку с помощью сеансов
Привет, Серджиу Дамиан, я понял, что ты сказал ... но я не знаю, как получать данные двунаправленным способом ... не могли бы вы рассказать мне на примере?