Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 单元格上的datagridview位置_C#_Vb.net_Datagridview - Fatal编程技术网

C# 单元格上的datagridview位置

C# 单元格上的datagridview位置,c#,vb.net,datagridview,C#,Vb.net,Datagridview,通过使用事件 我有密码 Private Sub dgPredracunS_CellValueChanged(sender As Object, e As DataGridViewCellEventArgs) Handles dgPredracunS.CellValueChanged _curRow= e.RowIndex _curCell= e.ColumnIndex If dgPredracunS.Columns(e.ColumnIndex).Nam

通过使用事件 我有密码

 Private Sub dgPredracunS_CellValueChanged(sender As Object, e As DataGridViewCellEventArgs) Handles dgPredracunS.CellValueChanged

     _curRow= e.RowIndex  
     _curCell= e.ColumnIndex

       If dgPredracunS.Columns(e.ColumnIndex).Name = "Quant" Then
           If dgPredracunS.Rows(e.RowIndex).Cells("Quant").Value > 10 Then
               MsgBox("Enter new value")
               dgPredracunS.CurrentCell = dgPredracunS(_curRow, _curCell)
           End if
       End if
End Sub
我想在该单元格上定位,以便用户可以输入新值。否则,它应该像现在一样通过datagrid。但主要原因是它不会聚焦于那个细胞


我知道事件验证,但由于某些原因,我无法执行此操作,因为此事件上有大量代码。

使用
cellvalinging
事件,并用
ErrorText
属性提示用户:

Private Sub dgPredracunS_CellValidating(sender As Object, e As DataGridViewCellValidatingEventArgs) Handles dgPredracunS.CellValidating

        If dgPredracunS.Rows(e.RowIndex).IsNewRow Then Return
        If dgPredracunS.Columns(e.ColumnIndex).Name = "Quant" Then
        Me.dgPredracunS.Rows(e.RowIndex).ErrorText = ""
        If CType(e.FormattedValue.ToString(), Integer) > 10 Then
            e.Cancel = True
            Me.dgPredracunS.Rows(e.RowIndex).ErrorText = "the value is not valid"
        End If
    End If

End Sub

原来的帖子很难理解,但是从你对@jonathana的评论来看,答案是正确的

“这不是我问题的解决方案,主要原因是在datagrid上,我有5列可以通过datagrid进行编辑,所以im 在网格和编辑单元格中使用键箭头移动。主要原因是 如果我输入了无效值,它应该停止并再次关注该值 “细胞”

如果我理解正确,用户在更改前一单元格中的值后,将使用箭头键转到下一列。然而,这是可行的;你评论的主要原因可能比表面上看起来要复杂一些。您的评论:

'主要原因是,如果输入无效值,它将停止并再次聚焦于该单元格'

要在用户按下箭头键、回车键、制表键或任何其他键后返回上一个单元格,可能是一个挑战。触发
CellValidating
CellValueChanged
事件后,
DataGridView
控件将移动到此新位置。因此,在不知道用户按下了什么“键”(右箭头、左箭头、向上箭头、、等)的情况下,可能很难确定“上一个”单元格的位置,因为
DataGridView
控件不知道

一个可能的解决方案是按照上面的建议,从“Quant”列中的单元格中捕获按下的每个键。这种方法可能有些过分;但这将允许您捕获用户在更改单元格值时按下的键。如果用户试图在单元格中的值无效时使用箭头键,则可以弹出消息并忽略按下的箭头键。或者,不允许用户输入无效值。每次用户按下一个键时检查该值,如果该值超过10,则弹出一条消息并忽略按下的键

遵循jonathana的方法,添加一些错误检查,以捕获错误数字并忽略空白单元格。用户将无法在“Quant”列单元格中键入大于10的值并保留这些值。如果用户输入的值超过10并试图离开单元格,则会弹出一条消息,指示错误,然后简单地忽略(取消编辑)用户输入的内容,保留旧值,最后让
DataGridView
控件移动到下一个单元格。如果用户输入字符(无效数字),那么很明显,字符串与整数值(10)的比较毫无意义,因此与以前一样…只需忽略用户输入,保留旧值,并允许
DataGridView
控件移到下一个单元格。由于这允许添加新行,“Quant”单元格可能为空且没有值。因此,允许使用空白值。希望这有帮助

Private Sub dgPredracunS_CellValidating(sender As Object, e As DataGridViewCellValidatingEventArgs) Handles dgPredracunS.CellValidating
  Dim newValue As Integer
  Dim oldValue As String
  If dgPredracunS.Rows(e.RowIndex).IsNewRow Then Return
  If (Not (dgPredracunS.Columns(e.ColumnIndex).Name = "Quant")) Then Return

  If (dgPredracunS.Rows(e.RowIndex).Cells("Quant").Value IsNot Nothing) Then
    oldValue = dgPredracunS.Rows(e.RowIndex).Cells("Quant").Value
  Else
    oldValue = ""
  End If

  If (Int32.TryParse(e.FormattedValue.ToString(), newValue)) Then
    If newValue > 10 Then
      PrintErrorMessage("Can not be greater than 10: ", newValue.ToString(), oldValue, e.RowIndex, e.ColumnIndex)
    End If
  Else
    If Not e.FormattedValue = "" Then
      PrintErrorMessage("Not a valid number: ", e.FormattedValue, oldValue, e.RowIndex, e.ColumnIndex)
    End If
  End If
End Sub

Private Sub PrintErrorMessage(message As String, newValue As String, oldValue As String, row As Int32, col As Int32)
  MsgBox(message + newValue + " in cell row: " + row.ToString() + " Col: " + col.ToString() + Environment.NewLine() +
           "... Using old value: " + oldValue)
  dgPredracunS.CancelEdit()
End Sub

嘿@jonathana这不是我问题的解决方案主要原因是在datagrid上我有5列可以通过datagrid编辑,所以我用键箭头移动网格和编辑单元格。主要原因是,如果我输入了无效值,它将停止并再次关注该单元格