У меня есть форма окна с DataGridView с несколькими источниками привязки данных. В загрузке формы правильно с соответствующими данными,Дисплей DataGridView превращается в беспорядок при прокрутке
но когда я прокрутки (или полосы прокрутки или колесо мыши), он превращается в это:
Если я обновить форму на новом выборе линии , он возвращается к началу формы. Я вижу, что есть событие DataGridView.Scroll. Что мне нужно делать с этим? Есть ли что-то еще, что мне нужно изменить, чтобы моя форма выглядела красиво снова?
thx!
EDIT
Ниже приведен код, который запускается в момент. Там нет ничего, что дополнительные ручки, как форма рисуется/перерисовывается, и нет обращения на DataGridView1.scroll
Imports datagridviewautofilter
Imports System.Data.SqlClient
Public Class AssignShipDateForm
'sql datastream connection variables
Dim Conn As New System.Data.SqlClient.SqlConnection 'sql server datastream connection
Dim Cmd As New System.Data.SqlClient.SqlCommand 'sql command vars
Dim SqlQuery As String 'string var used to hold various SQL queries
Dim SqlInsertQuery As String 'sql insert query for data adapter
Dim SqlUpdateQuery As String 'sql update query for data adapter
Dim SqlDeleteQuery As String 'sql delete query for data adapter
Dim data As System.Data.SqlClient.SqlDataReader 'datareader object variable
Dim ConnString As String
Dim da As SqlDataAdapter
'MasterVars table variables
Public Vers As String = Nothing 'tally sheet version
Public Testing As Boolean = False 'tf testing
Public SendMailAcct As String = Nothing 'send email account for automated emails
Public SendMailPW As String = Nothing 'password for email account
Public SMTPUseSSL As Boolean = True ' SMTP SSL
Public SMTPAuthenticate As Integer = 0 'Authenticate SMTP
Public SMTPServer As String = Nothing 'Email Server
Public SendUsing As Integer = 0 'Send Using
Public SMTPServerPort As Integer = 0 'SMTP Email Server Port
Public TestingEmail As String = Nothing 'email account that all emails should be directed to when version is testing
Public PrePricingEmail As String = Nothing 'email account that all prod prepricing emails should be directed to
Public ImperataEmail As String = Nothing 'email account that all prod Imperata emails should be directed to (for permits etc)
Public DirectShipEmail1 As String = Nothing 'email account that all prod direct ship orders should be directed to
Public DirectShipEmail2 As String = Nothing 'email account that all prod direct ship orders should be directed to
Public DirectShipEmail3 As String = Nothing 'email account that all prod direct ship orders should be directed to
Public DirectShipEmail4 As String = Nothing 'email account that all prod direct ship orders should be directed to
'user security variables
Public EMailAddress As String = Nothing 'User's email address
Public ThePersonsName As String = Nothing 'User's name
Public Logistics As String = Nothing 'logistics module access level
'close form with changes pending variables
Dim CloseForm As New Shared_Code.SharedCode
Dim ShouldICloseForm As String = Nothing 'determiniation if the form should be closed or not
'error reporting variables
Dim ErrorReporting As New ErrorReporting.ErrorReporting
Public Shared ErrCode As String = Nothing 'error code
Public Shared ErrVar As String = Nothing 'variable that caused error
Public Shared ErrorCounter As Integer = 0 'error Counter
Public Shared ErrAct As Boolean = False 't/f fatal error
'INITIALIZE FORM
Dim FirstPass As Boolean = True 't/f switch to determine if form initialize is on a first pass or subsequent pass
'CELL VALUE CHANGED
Dim RowUpdated As Boolean = False 't/f flag to set if the row has been updated
Dim SelectedShipDate As String = Nothing 'selected ship date
Dim SelectedShipDateCounter As Integer = 0 'selected ship date PKEY for TempTable
Dim NumberOfTrucksAvailable As Integer = 0 'number of trucks available for selected Ship Date
Dim DefaultPickDateCounter As Integer = 0 'counter (PKEY) for default pick date
Dim DefaultPickDate As String = Nothing 'default pick date derived from PKEY
Dim i As Integer = 0 'counter variable for adding number of trucks available from MasterBusinessDatesTable
'SAVE BUTTON
Dim vbYN As String = Nothing 'vbyn for msgbox
Dim PickID As String = Nothing 'Pkey for logistics records
Dim DTS As DateTime = Nothing 'DTS for updates
'********************************************************************************
'* *
'*CBB00: FORM LOAD *
'* *
'********************************************************************************
Public Sub New(ByRef vers As String, ByRef testing As Boolean, ByRef SendMailAcct As String, ByRef SendMailPW As String, ByVal SMTPUseSSL As Boolean, ByVal SMTPAuthenticate As Integer, ByVal SMTPServer As String, ByVal SendUsing As Integer, ByVal SMTPServerPort As Integer, ByRef TestingEmail As String, ByRef PrePricingEmail As String, ByRef ImperataEmail As String, ByRef DirectShipEmail1 As String, ByRef DirectShipEmail2 As String, ByRef DirectShipEmail3 As String, ByRef DirectShipEmail4 As String, ByRef EMailAddress As String, ByRef ThePersonsName As String, ByRef Logistics As String)
InitializeComponent()
Me.Vers = vers
Me.Testing = testing
Me.SendMailAcct = SendMailAcct
Me.SendMailPW = SendMailPW
Me.SMTPUseSSL = SMTPUseSSL
Me.SMTPAuthenticate = SMTPAuthenticate
Me.SMTPServer = SMTPServer
Me.SendUsing = SendUsing
Me.SMTPServerPort = SMTPServerPort
Me.TestingEmail = TestingEmail
Me.PrePricingEmail = PrePricingEmail
Me.ImperataEmail = ImperataEmail
Me.DirectShipEmail1 = DirectShipEmail1
Me.DirectShipEmail2 = DirectShipEmail2
Me.DirectShipEmail3 = DirectShipEmail3
Me.DirectShipEmail4 = DirectShipEmail4
Me.EMailAddress = EMailAddress
Me.ThePersonsName = ThePersonsName
Me.Logistics = Logistics
'set connection string and form for prod vs. test
If testing = True Then
ConnString = "data Source=SQL01;Initial Catalog=TallySheetTest;Integrated Security=SSPI;"
Me.Text = "Assign Ship Dates " & vers & " TESTING"
Else
ConnString = "data Source=SQL01;Initial Catalog=TallySheet;Integrated Security=SSPI;"
Me.Text = "Assign Ship Dates " & vers
End If
For Each col As DataGridViewColumn In DataGridView1.Columns
col.HeaderCell = New DataGridViewAutoFilterColumnHeaderCell(col.HeaderCell)
Next
DataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells
DataGridView1.DefaultCellStyle.WrapMode = DataGridViewTriState.True
Call FormInitialize()
End Sub
'********************************************************************************
'* *
'*CBC00: FORM INITIALIZE *
'* *
'********************************************************************************
Public Sub FormInitialize()
'clear Dataset
Me.TallySheetDataSet.Clear()
If FirstPass = True Then
'Do nothing
Else
'????????
End If
FirstPass = False
'Set buttons
Select Case Logistics
Case "I"
Button1.Enabled = False
Button2.Enabled = False
Case Else
Button1.Enabled = True
Button2.Enabled = False
End Select
'TODO: This line of code loads data into the 'TallySheetDataSet.TruckTypeTable' table. You can move, or remove it, as needed.
Me.TruckTypeTableTableAdapter.Fill(Me.TallySheetDataSet.TruckTypeTable)
'SPCBC0001 Check if TempTable1 is empty
Try
Using Conn = New SqlConnection(ConnString)
Dim cmd As New SqlCommand
cmd.Connection = Conn
cmd.CommandText = "SPCBC0001"
cmd.CommandType = CommandType.StoredProcedure
Conn.Open()
data = cmd.ExecuteReader()
data.Read()
If data.HasRows = True Then
ErrCode = "CBC00-03"
ErrVar = "TempTable1"
ErrorCounter = ErrorCounter + 1
ErrAct = ErrorReporting.YouBrokeMyProgram("", ErrCode, ErrVar, ErrorCounter, Testing, Vers, TestingEmail, SendMailAcct, SendMailPW, EMailAddress, SMTPUseSSL, SMTPAuthenticate, SMTPServer, SendUsing, SMTPServerPort)
vbYN = MsgBox("Would you like to clear temporary tables?", vbQuestion + vbYesNo + vbSystemModal, "")
If vbYN = vbYes Then
Call ClearTempTables()
Else
Exit Sub
End If
End If
End Using
Catch ex As SqlException
ErrCode = "CBC00-04"
ErrVar = "SPCBC0001;" & vbCrLf & vbCrLf & ex.Message
ErrorCounter = ErrorCounter + 1
ErrAct = ErrorReporting.YouBrokeMyProgram("", ErrCode, ErrVar, ErrorCounter, Testing, Vers, TestingEmail, SendMailAcct, SendMailPW, EMailAddress, SMTPUseSSL, SMTPAuthenticate, SMTPServer, SendUsing, SMTPServerPort)
If ErrAct = True Then
Exit Sub
End If
Finally
Conn.Close()
Conn.Dispose()
End Try
'SPCBC0002 - Check if TempTable2 is empty
Try
Using Conn = New SqlConnection(ConnString)
Dim cmd As New SqlCommand
cmd.Connection = Conn
cmd.CommandText = "SPCBC0002"
cmd.CommandType = CommandType.StoredProcedure
Conn.Open()
data = cmd.ExecuteReader()
data.Read()
If data.HasRows = True Then
ErrCode = "CBC00-06"
ErrVar = "TempTable2"
ErrorCounter = ErrorCounter + 1
ErrAct = ErrorReporting.YouBrokeMyProgram("", ErrCode, ErrVar, ErrorCounter, Testing, Vers, TestingEmail, SendMailAcct, SendMailPW, EMailAddress, SMTPUseSSL, SMTPAuthenticate, SMTPServer, SendUsing, SMTPServerPort)
vbYN = MsgBox("Would you like to clear temporary tables?", vbQuestion + vbYesNo + vbSystemModal, "")
If vbYN = vbYes Then
Call ClearTempTables()
Else
Exit Sub
End If
End If
End Using
Catch ex As SqlException
ErrCode = "CBC00-07"
ErrVar = "SPCBC0002" & vbCrLf & vbCrLf & ex.Message
ErrorCounter = ErrorCounter + 1
ErrAct = ErrorReporting.YouBrokeMyProgram("", ErrCode, ErrVar, ErrorCounter, Testing, Vers, TestingEmail, SendMailAcct, SendMailPW, EMailAddress, SMTPUseSSL, SMTPAuthenticate, SMTPServer, SendUsing, SMTPServerPort)
If ErrAct = True Then
Exit Sub
End If
Finally
Conn.Close()
Conn.Dispose()
End Try
'SPCBC0003 - Fill TempTable1 from MasterOrderTable, Customer, MasterLog
Try
Using Conn = New SqlConnection(ConnString)
Dim cmd As New SqlCommand
cmd.Connection = Conn
cmd.CommandText = "SPCBC0003"
cmd.CommandType = CommandType.StoredProcedure
Conn.Open()
cmd.ExecuteNonQuery()
End Using
Catch ex As Exception
ErrCode = "CBC00-01"
ErrVar = "SPCBC0003" & vbCrLf & vbCrLf & ex.Message
ErrorCounter = ErrorCounter + 1
ErrAct = ErrorReporting.YouBrokeMyProgram("", ErrCode, ErrVar, ErrorCounter, Testing, Vers, TestingEmail, SendMailAcct, SendMailPW, EMailAddress, SMTPUseSSL, SMTPAuthenticate, SMTPServer, SendUsing, SMTPServerPort)
If ErrAct = True Then
Exit Sub
End If
Finally
Conn.Close()
Conn.Dispose()
End Try
'SPCBC0004 - Fill DataSet TempTable1 from TempTable1
Try
Using Conn = New SqlConnection(ConnString)
Dim cmd As New SqlCommand("SPCBC0004", Conn)
cmd.CommandType = CommandType.StoredProcedure
Dim da As New SqlDataAdapter(cmd)
da.Fill(Me.TallySheetDataSet.TempTable1MasterOrders)
End Using
Catch ex As SqlException
ErrCode = "CBC00-05"
ErrVar = "SPCBC0004" & vbCrLf & vbCrLf & ex.Message
ErrorCounter = ErrorCounter + 1
ErrAct = ErrorReporting.YouBrokeMyProgram("", ErrCode, ErrVar, ErrorCounter, Testing, Vers, TestingEmail, SendMailAcct, SendMailPW, EMailAddress, SMTPUseSSL, SMTPAuthenticate, SMTPServer, SendUsing, SMTPServerPort)
If ErrAct = True Then
Exit Sub
End If
Finally
Conn.Close()
Conn.Dispose()
End Try
'handling if no rows exist
If TallySheetDataSet.TempTable1MasterOrders.Rows.Count = 0 Then
MsgBox("No open orders") '<-------------------------------- add error reporting?
Exit Sub
End If
'SPCBC0005 - Fill TempTable2 from MasterBusinessDatesTable
Try
Using Conn = New SqlConnection(ConnString)
Dim cmd As New SqlCommand
cmd.Connection = Conn
cmd.CommandText = "SPCBC0005"
cmd.CommandType = CommandType.StoredProcedure
Conn.Open()
cmd.ExecuteNonQuery()
End Using
Catch ex As SqlException
ErrCode = "CBC00-02"
ErrVar = "SPCBC0005" & vbCrLf & vbCrLf & ex.Message
ErrorCounter = ErrorCounter + 1
ErrAct = ErrorReporting.YouBrokeMyProgram("", ErrCode, ErrVar, ErrorCounter, Testing, Vers, TestingEmail, SendMailAcct, SendMailPW, EMailAddress, SMTPUseSSL, SMTPAuthenticate, SMTPServer, SendUsing, SMTPServerPort)
If ErrAct = True Then
Exit Sub
End If
Finally
Conn.Close()
Conn.Dispose()
End Try
'SPCBC0006 - Fill DataSet TempTable2 from TempTable2
Try
Using Conn = New SqlConnection(ConnString)
Dim cmd As New SqlCommand("SPCBC0006", Conn)
cmd.CommandType = CommandType.StoredProcedure
Dim da As New SqlDataAdapter(cmd)
da.Fill(Me.TallySheetDataSet.TempTable2BusinessDates)
End Using
Catch ex As SqlException
ErrCode = "CBC00-08"
ErrVar = "SPCBC0006" & vbCrLf & vbCrLf & ex.Message
ErrorCounter = ErrorCounter + 1
ErrAct = ErrorReporting.YouBrokeMyProgram("", ErrCode, ErrVar, ErrorCounter, Testing, Vers, TestingEmail, SendMailAcct, SendMailPW, EMailAddress, SMTPUseSSL, SMTPAuthenticate, SMTPServer, SendUsing, SMTPServerPort)
If ErrAct = True Then
Exit Sub
End If
Finally
Conn.Close()
Conn.Dispose()
End Try
'set ALL columns read only property to true
DataGridView1.Columns(0).ReadOnly = True
DataGridView1.Columns(1).ReadOnly = True
DataGridView1.Columns(2).ReadOnly = True
DataGridView1.Columns(3).ReadOnly = True
DataGridView1.Columns(4).ReadOnly = True
DataGridView1.Columns(5).ReadOnly = True
DataGridView1.Columns(6).ReadOnly = True
DataGridView1.Columns(7).ReadOnly = True
DataGridView1.Columns(8).ReadOnly = True
DataGridView1.Columns(9).ReadOnly = True
DataGridView1.Columns(10).ReadOnly = True
DataGridView1.Columns(11).ReadOnly = True
DataGridView1.Columns(12).ReadOnly = True
DataGridView1.Columns(13).ReadOnly = True
DataGridView1.Columns(14).ReadOnly = True
DataGridView1.Columns(15).ReadOnly = True
DataGridView1.Columns(16).ReadOnly = True
DataGridView1.Columns(17).ReadOnly = True
DataGridView1.Columns(18).ReadOnly = True
DataGridView1.Columns(19).ReadOnly = True
DataGridView1.Columns(20).ReadOnly = True
DataGridView1.Columns(21).ReadOnly = True
DataGridView1.Columns(22).ReadOnly = True
DataGridView1.Columns(23).ReadOnly = True
'Refresh form
Me.Refresh()
DataGridView1.Refresh()
End Sub
EDIT
я есть пустой обработчик для события DataGridView1.DataError. Я добавил окно сообщения, и «Дата отправки» выдает ошибку для каждого значения в столбце, а затем, когда вы прокручиваете ее, она выдает ошибку для каждой новой ячейки «Дата отправки». Ошибка для нулевого значения, отображаемого в столбце, который не принимает нулевое значение. Нулевое значение - попытка подавить значение '1900-01-01' от отображения.
Является ли столбец, показанный на втором изображении, только виновным столбцом? Какой тип столбца, возможно, пользовательский? Вы вручную обрабатываете любой из рендеринга или изменили какое-либо поведение рендеринга? Скриншоты хороши, но они не помогают нам воспроизвести проблему. Также необходим минимальный пример. – OhBeWise
Да, столбец «Дата отправки» является единственным виновным. Это связанная колонка DataGridViewComboBox. Следующие 3 столбца справа также связаны столбцами DataGridViewComboBox. Каждый из 4 связан с разными источниками. Я не обрабатываю рендеринг вручную и не изменяю никакого поведения рендеринга (о котором я сознательно знаю). Столбец «Дата отправки» имеет значение по умолчанию, выбранное при выборе даты отправки. –
В какой-то момент времени я пытался заполнить список «group» ComboBox на основе значения, выбранного в столбце «Дата отправки», а затем заполнить «Sequence» на основе «Group». Однако были проблемы с этим. Строка продолжала бы вызывать событие изменения ячейки и очищать все выбранные значения после выхода ячейки –