2013-11-26 6 views
2

Я хотел создать datatable на основе 5 столбцов. Кроме того, я хотел бы удалить последний столбец (это столбец изображения).

VB.Net Datagridview to Datatable

В принципе, то, что я хотел, чтобы это (псевдокод)

datatable = datagridview.datasource 


Я попытался это, но не смог:

Dim dt As New DataTable 
dt = TryCast(dgvCarAccidentInjury.DataSource, DataTable) 


И это

Dim dt As New DataTable(dgvCarAccidentInjury.DataSource) 


Опять мне не удалось. Я видел это на столбце C#, но я не знаю, как его преобразовать в vb.net, может быть, это решение, но я не знаю синтаксиса в VB.

DataTable data = (DataTable)(dgvMyMembers.DataSource); 

Я могу сделать это вручную зацикливание, но есть простой способ, как, как это на C#?


EDIT Я поставил данные моего DataGridView вручную, выполнив эту строку кода,

dgvCarAccidentInjury.Rows.Add(New String() {"test1", "test2", "test3", "test4"}) 

Кроме того, есть пятая колонна (колонна изображение), на самом деле это пустой. Извините, я пропустил этот важный момент.

РЕДАКТИРОВАТЬ

решение этой проблемы заключается в следующем, вручную петли.

Dim dt As New DataTable 
    Dim r As DataRow 

    dt.Columns.Add("a", Type.GetType("System.String")) 
    dt.Columns.Add("b", Type.GetType("System.String")) 
    dt.Columns.Add("c", Type.GetType("System.String")) 
    dt.Columns.Add("d", Type.GetType("System.String")) 

    For i = 0 To dgvCarAccidentInjury.Rows.Count - 1 
     r = dt.NewRow 
     r("a") = dgvCarAccidentInjury.Item(0, i).Value.ToString 
     r("b") = dgvCarAccidentInjury.Item(1, i).Value.ToString 
     r("c") = dgvCarAccidentInjury.Item(2, i).Value.ToString 
     r("d") = dgvCarAccidentInjury.Item(3, i).Value.ToString 
     dt.Rows.Add(r) 
    Next 

Другие решения:

Dim dt As New DataTable 
dt = TryCast(yourdatagridview.DataSource, DataTable) 
+0

Можете ли вы показать нам, как вы установили Datasource? – OneFineDay

+0

Я уже его отредактировал .. hmmm – Codemunkeee

+0

Да, и там в лжи проблема. У вас нет DataTable, чтобы вытащить из DataGridView. – OneFineDay

ответ

2

Ваша проблема заключается не отливка:

dt = TryCast(dgvMyMembers.DataSource, DataTable) 

Но ваш DataSource не является DataTable но массив строки:

dgvCarAccidentInjury.Rows.Add(New String() {"test1", "test2", "test3", "test4"}) 

Итак, убедитесь, что ваш DataGridView был правильно подключен DataTable sourceПЕРВОЕ, как:

dgvMyMembers.DataSource = dtSourceHere 

Вероятно, это сделать ваш Form_Load()

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 

dgvMyMembers.DataSource = dtSourceHere 

End Sub 

Если вы хотите, чтобы добавить строку в ваш DataGridView , вам лучше создать DataTable, добавьте эти строки, например:

Dim dt As New DataTable 
    dt.Columns.Add("Names", GetType(String)) 

    dt.Rows.Add("test1") 
    dt.Rows.Add("test2") 
    dt.Rows.Add("test3") 
    dt.Rows.Add("test4") 

Тогда сделайте это как DataSource вашего DataGridView:

dgvMyMembers.DataSource = dt 

Вы могли бы сделать потом на TryCast() что вы пожелали:

Dim dtNew As New DataTable 
    dtNew = TryCast(dgvMyMembers.DataSource, DataTable) 
+0

Он сделал ......... – OneFineDay

+0

Да, я не видел его ..лол. Я попробовал это на своем компьютере, и он работает. Наверное, что-то еще ему не хватает. Спасибо @DonA – Edper

+0

Я попытался проверить, что с помощью msgbox (dt.rows.count), но он говорит: «Ссылка на объект не установлена ​​в экземпляр объекта». – Codemunkeee

1

ли вы попробовать клонировать таблицу? Если вы установили DataSource с DataTable, вы клонируете оригинал. Если у вас есть diff DataSource - он не будет работать с преобразованием DataSource.

DataTable.Clone

Dim dt As DataTable = originalDt.Clone() 
+0

: «Объектная переменная или с переменной блока не установлена». Dim dt As New DataTable dt = dgvCarAccidentInjury.DataSource.Clone() – Codemunkeee

+0

Это похоже на мой код? – OneFineDay

+0

У вас должен быть доступ к оригинальному DT, не так ли? – OneFineDay

2
Dim DtGrid As DataTable 
DtGrid = CType(dgrd_WWWH.DataSource, DataTable).Copy() 
+1

"Ссылка на объект не установлена ​​в экземпляр объекта." Я попытался проверить значения внутри DtGrid с помощью MsgBox (DtGrid.Rows (0) .Item (0)) – Codemunkeee

+0

Я думаю, что источник данных пуст, задает точку останова, а затем вы проверяете – SK2185

+0

. Я в аналогичной ситуации. При попытке ваших предложений я получаю 'System.InvalidCastException: Невозможно наложить объект типа« System.Windows.Forms.BindingSource »на тип« Microsoft.Office.Interop.Excel.DataTable ». –

0
--MENU-- 
Dim login As New LoginClass 
login.ShowDialog() 

--CONEXION-- 
Private conec As SqlConnection 
Dim stringCon As String = "Data Source= ;Initial Catalog=;Persist Security Info=True;User ID=;Password=" 
Public ReadOnly Property prConec() As Object 
    Get 
     Return conec 
    End Get 
End Property 
Public Sub Conectar() 
    Try 
     conec = New SqlConnection(stringCon) 
     If conec.State <> ConnectionState.Open Then 
      conec.Open() 
     End If 
    Catch ex As Exception 
     MessageBox.Show(ex.Message) 
    End Try 
End Sub 

--BUSCAR-- 
funciones.Conectar() 
Dim coman As New SqlCommand("sp_cliente", funciones.prConec) 
Dim dt As New DataTable 
coman.CommandType = CommandType.StoredProcedure 
coman.Parameters.Add("@i_operacion", SqlDbType.Char, 1, ParameterDirection.Input).Value = "B" 
dt.Load(coman.ExecuteReader()) 
grdClientes.DataSource = dt 

--INSERTAR-- 
funciones.Conectar() 
Dim coman As New SqlCommand("sp_articulo", funciones.prConec) 
coman.CommandType = CommandType.StoredProcedure 
coman.Parameters.Add("@i_operacion", SqlDbType.Char, 1, ParameterDirection.Input).Value = "I" 
coman.ExecuteNonQuery() 
Buscar() 
Limpiar() 

--COMBO-- 
Dim dt As New DataTable 
dt.Columns.Add("Codigo") 
dt.Columns.Add("Descripcion") 
Dim dr1 As DataRow = dt.NewRow 
dr1.Item("Codigo") = "A" 
dr1.Item("Descripcion") = "Activo" 
dt.Rows.Add(dr1) 
Dim dr2 As DataRow = dt.NewRow 
dr2.Item("Codigo") = "I" 
dr2.Item("Descripcion") = "Inactivo" 
dt.Rows.Add(dr2) 
cmbEstado.DataSource = dt 
cmbEstado.ValueMember = "Codigo" 
cmbEstado.DisplayMember = "Descripcion" 

--GRIDVIEW-- 
--1-- 
Dim grdFila As DataGridViewRow = grdClientes.CurrentRow 
txtCedula.Text = grdFila.Cells(0).Value 
--2-- 
If DataGridProductos.CurrentCell.ColumnIndex = 0 Then 
    Dim FLstArticulos As New FLstArticulos 
    FLstArticulos.ShowDialog() 
    DataGridProductos.CurrentRow.Cells(0).Value = FLstArticulos.PrIdArticulo 
End If 

--GRIDVIEW.CELLENDEDIT-- 
If DataGridProductos.CurrentCell.ColumnIndex = 3 Then 
    Dim precio As New Double 
    Dim cantidad As New Double 
    precio = CDbl(grdRow.Cells(2).Value) 
    cantidad = CDbl(grdRow.Cells(3).Value) 
    DataGridProductos.CurrentRow.Cells(4).Value = PLTotalFilaItem(cantidad, precio) 
    PLCargaTotales() 
End If 

Sub PLCargaTotales() 
    Dim subTotal As Double 
    Dim iva As Double 
    For Each grd As DataGridViewRow In DataGridProductos.Rows 
     If Not String.IsNullOrEmpty(grd.Cells(4).Value) Then 
      subTotal = subTotal + CDbl(grd.Cells(4).Value) 
     End If 
    Next grd 
    txtSubtotal.Text = subTotal.ToString 
    iva = Decimal.Round(subTotal * 0.12) 
    txtIva.Text = iva.ToString 
    txtTotalPagar.Text = (subTotal + iva).ToString 
End Sub 
+0

Просьба пояснить код только для ответа, он не очень полезен без какого-либо описания. – Jeet

Смежные вопросы