2015-10-13 5 views
1

У меня есть программа, которая запрашивает у пользователя ряд вопросов, которые собираются из базы данных и хранятся в datatable.Удаление строки из datatable

У меня есть система, которая выбирает два случайных числа, чтобы определить, какой вопрос и какой из них определить, какой порядок ответов отображается. Я хочу, чтобы вопросы оставались в данных, пока пользователь не поправил их, и впоследствии этот вопрос не может возникнуть снова.

Мой DataTable называется DT, и есть строка кода:

DT.Rows.RemoveAt(QNumber) 

Это звучит, как он должен удалить строку, выбранную. Однако у меня есть вопрос относительно этого.

Если, например, QNumber было 2, и поэтому строка 2 была удалена. Будет ли это перемещать все из строки 3 в строку 2, а затем все из строки 4 в строку 3 и т. Д., Или это просто сделает строку 2 пустой и так сломает мой код?

+3

'Будет ли это тогда перемещать все ...' да. Когда 2 из 7 удалено, теперь есть 6, но есть что-то другое в индексе 2 – Plutonix

+0

@Plutonix. Пожалуйста, дайте ответ как ответ, а не как комментарий (иначе кто-то может его взять, поместить в ответ, и они я получу репутацию). – cybermonkey

+2

черт. что было бы ужасно – Plutonix

ответ

1

Поскольку вы не размещать какие-либо контекста некоторые тестовые фрагменты:

Button1_Click загружает таблицу

button2_Click «процессы» в каждой строке и при необходимости удаляет строку.

В вашем случае «процесс» означает: отображать вопрос и цикл, пока не получите ответ.

В вашем случае код Button2 определит, какую запись загрузить, возможно, используя .Select() в datatable, который возвращает «вопрос», чтобы спросить и в конечном итоге удалить.

Dim da As SqlDataAdapter 
Dim ds As DataSet 
Dim dt As DataTable 
Dim con As New System.Data.SqlClient.SqlConnection() 

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    Try 
     Using con As New System.Data.SqlClient.SqlConnection() 
      con.ConnectionString = "Data Source=APCD03;Initial Catalog=OIStest;Integrated Security=True" 
      Dim rdr As Data.SqlClient.SqlDataReader 
      con.Open() 
      Dim cmd As New SqlCommand("SELECT [DBLinked] as PK ,[TEBackupDate] FROM [OISTest].[dbo].[_DBLink]", con) 
      rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection) 
      dt = New DataTable 
      dt.Load(rdr) 
      rdr.Close() 
     End Using 
    Catch ex As Exception 
     MsgBox(ex, ex.Message) 
    End Try 
End Sub 

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click 
    For Each row As DataRow In dt.Rows 
     If Not row.RowState = DataRowState.Deleted Then 
      If MsgBox("Delete this row, PK: " & row("PK"), vbYesNo) = MsgBoxResult.Yes Then 
       row.Delete() 
      End If 
     End If 
    Next 
End Sub 

Button3 демки Выбор конкретной строки для обработки и удаления:

Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click 
    Dim rows() As DataRow = dt.Select("PK='test row'") 
    If rows.Length = 0 Then 
     MsgBox("row was deleted already") 
    Else 
     MsgBox(rows(0)(0)) ' display PK 
     If MsgBox("Delete " & rows(0)(0), vbYesNo) = MsgBoxResult.Yes Then 
      rows(0).Delete() 
     End If 
    End If 
End Sub 

Обратите внимание, что rows(0) первая запись результата от выбора - не индекса рекорд в общей таблице.

+0

Не было бы простого способа показать вам мой код, если я не отредактирую его до конца своего сообщения или не надену его на pastebin. Я могу сделать любой из них, если вы хотите. Я только спрашивал о конкретной функции, поэтому я не чувствовал, что ей нужны примеры. Спасибо за длинный ответ, хотя, интересно читать, так как все это совсем не так, как я это сделал. Даже когда вы заполняли dat.load, это не то, как я это сделал. Возможно, я должен показать вам свой код, и вы могли бы рассказать мне, как/если бы я мог его улучшить? – DatBrummie

+0

Мой код для заполнения DT обычно завернут в Function(), который возвращает datatable - я просто передаю SQL. Это упрощает получение таблицы. У меня есть аналогичные функции для Scalars, Dataviews и других обычных задач ADO.Net. Это сильно отличается от связанных элементов управления. У меня просто есть свободное время для долгого ответа - не очень ищут задачи обзора кода. Если у вас есть очки, не стесняйтесь публиковать код. – rheitzman

+0

Обычно я использую DT = RunSQL (SQL), где RunSQL является функцией, которая возвращает базу данных, а затем SQL является строкой. Одна строка вашего кода, которую мне особенно интересовала, была в самом последнем фрагменте. Что такое «vbYesNo»? Похоже, что он дает сообщение с опцией «да» или «нет» вместо кнопки «ОК»? Это звучит как что-то, что мне нужно для подтверждения удаления чего-либо в другом месте кода. – DatBrummie

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