0

行数が 0 から x の可能性があるデータベースからのクエリ結果を表示するために、datagridview を使用します。
そのため、下にあるフォームのサイズと、一致した行の数に依存するデータグリッドビューを計算する計算を行いました。
基礎となるフォームは透過的であり、そのすべてがユーザー コントロールのように見え、何を表示し、正常に動作するかのように見えます。

しかし、ここに 1 つの問題があります。
データグリッドを拡張する必要があるたびに、データグリッドがいっぱいになる前にその領域に黒い四角形が表示されます。これは望ましくなく、明らかに望ましくありません。

これを回避するために何か通常のことをすることはできますか?
datagridview には、入力が終了したときにデータをフリーズして表示するメカニズムがありましたか?
または、他に何をしますか?

   Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged

    Dim tw As Integer = 0
    Dim n As Integer = 0
    Dim sqlText As String
    Dim reader As OdbcDataReader = Nothing
    Dim btCommand As OdbcCommand = Nothing
    Dim mCmd As OdbcCommand = Nothing
    Dim mCon As New Odbc.OdbcConnection

    DataGridView1.Rows.Clear()
    If Trim(TextBox1.Text).Length Then
        mCon.ConnectionString = "Dsn=" + dbDsn + _
                                ";database=" + mydatabase + ";server=" + dbServer + ";port=" + dbPort + _
                                ";uid=" + dbUser + ";pwd=" + dbPass
        Try
            mCon.Open()
            btCommand = New OdbcCommand("BEGIN TRANSACTION", mCon)
            sqlText = "SELECT dtbl_id, name... etc... FROM mytable WHERE name ILIKE '%" & Trim(TextBox1.Text) & "%' ORDER BY name LIMIT 128"
            mCmd = New OdbcCommand(sqlText, mCon)
            reader = mCmd.ExecuteReader()
            While (reader.Read())

                Dim t_kol, t_ci As String
                If reader.GetValue(4) - reader.GetValue(5) = 0 Then
                    t_kol = "- "
                Else
                    t_kol = FormatNumber((reader.GetValue(4) - reader.GetValue(5)), 2)
                End If
                t_ci = FormatNumber(reader.GetValue(3))

                With DataGridView1.Rows.Add(New String() {reader.GetValue(0).ToString(), _
                                                          reader.GetValue(1).ToString(), _
                                                          reader.GetValue(2).ToString(), _
                                                          t_kol, _
                                                          t_ci, _
                                                          reader.GetValue(6).ToString(), _
                                                          reader.GetValue(7).ToString})
                    n = n + 1
                End With
            End While
            btCommand = New OdbcCommand("END TRANSACTION", mCon)
        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.Critical + MsgBoxStyle.OkOnly)
        Finally
            reader.Close()
            reader.Dispose()
            btCommand.Dispose()
            mCmd.Dispose()

            If n < 1 Then
                DataGridView1.Height = 0
                DataGridView1.Height = DataGridView1.Height + DataGridView1.Top
            End If

        End Try
        mCon.Close()
        mCon.Dispose()
    End If

    If n < 1 Then
        DataGridView1.Height = 0
    Else
        DataGridView1.Height = DataGridView1.ColumnHeadersHeight + (n * DataGridView1.RowTemplate.Height) + 2
    End If

    Dim p As Point = Me.PointToScreen(DataGridView1.Location)
    If p.Y + DataGridView1.Height >= My.Computer.Screen.WorkingArea.Height Then DataGridView1.Height = My.Computer.Screen.WorkingArea.Height - p.Y

    tw = totalwidth + (Math.Abs(CInt(DataGridView1.Controls(1).Visible)) * CInt(DataGridView1.Controls(1).Width))
    DataGridView1.Width = tw + 2
    With Me
        .Width = tw + 4
        .Height = DataGridView1.Height + DataGridView1.Top
    End With
End Sub
4

1 に答える 1

0

あなたがどのようにコーディングしたかはわかりませんが、次のようなものを入れようとしましたか

DataGridView1.DataSource = someList
DataGridView1.DataBind()
If DataGridView.Rows.Count > 0 Then
    Dim p As Point = Me.PointToScreen(DataGridView1.Location)
    If p.Y + DataGridView1.Height >= My.Computer.Screen.WorkingArea.Height Then
        DataGridView1.Height = My.Computer.Screen.WorkingArea.Height - p.Y
        tw = totalwidth + (Math.Abs(CInt(DataGridView1.Controls(1).Visible)) * CInt(DataGridView1.Controls(1).Width))
        DataGridView1.Width = tw + 2
    With Me
        .Width = tw + 4
        .Height = DataGridView1.Height + DataGridView1.Top
    End With
End If
End Sub

あなたの方法で?

私が言ったように、私はあなたがあなたのプログラムをどのようにコーディングしたか知らないので、誤解しないでください。

編集:コードを変更しました。私が何を意味していたのかを見てください。本当に明確でなかったらごめんなさい。

問題は、いくつかの行が DataGridView に追加された後にのみポイントを描画する必要があるため、コードの一部を If ブロックに配置することです。DataSource と DataBind の部分は気にしないでください。If ブロックの要点を明確にしたかっただけです。

于 2012-06-19T20:56:30.873 に答える