1

DGV には、ユーザーが入力した値が入力されています (データにバインドされていません)。行数は動的です。ただし、デフォルトの 5 行であっても、セルからセルへ、および行から行へとタブ移動すると、最初の行 (行 0) が、最後の (5 番目の) 行 / 行 4 に到達すると、DGV の「上下」に消えてしまいます。

カーソルの位置に基づいて移動するのではなく、5 (または多くの) 行が常に同じ場所に留まるようにします。

このシナリオでこれがデフォルトの動作である理由はわかりませんが、それについて興味がありますが、ほとんどの場合、この奇妙さを防ぐ方法を知る必要があります.

ユーザーが行を追加すると、次のように各行の高さを計算します。

dataGridViewPlatypi.Rows.Add();
int newRowHeight = dataGridViewPlatypi.Height / dataGridViewPlatypi.RowCount;
for (int i = 0; i < dataGridViewPlatypi.RowCount; i++)
{
    dataGridViewPlatypi.Rows[i].Height = newRowHeight;
}

...この不正確な計算により、除算に剰余/モジュロがある場合、グリッドの下部に「余分なスペース」が生じる可能性があります。たとえば、次のようになります。グリッドの一番下にありますが、繰り返しになりますが、デフォルトの 5 行が高さ 160 ピクセルの DGV (行あたり 32 ピクセル) に収まっている場合でも、この不安な動作が発生します。

プロパティを設定する必要があるのか​​、DGV、行、セル、または...??? のコードを記述する必要があるのか​​ わかりません。

アップデート

設計時に DGV の高さに 2 を追加すると (160 ではなく 162 になり、各行が 32 になり、「DGV 用」に 2 ピクセルが残るため、デフォルトの 5 行で動作することがわかりました。

ただし、ユーザーが追加の行を追加するときに調整しようとすると、問題が発生することがわかっています。次の厄介なコードは機能しません。

// Adding one extra pixel is not enough; 2 is the least that can be added to prevent the last phantom grey row from appearing
const int BASE_GRID_HEIGHT_SHIM = 2;
const int DEFAULT_ROW_COUNT = 5;

dataGridViewPlatypi.Rows.Add();

int shimAdjustment = dataGridViewPlatypi.RowCount - DEFAULT_ROW_COUNT;
int newRowHeight = dataGridViewPlatypi.Height / dataGridViewPlatypi.RowCount;
int newGridHeight = (newRowHeight * dataGridViewPlatypi.RowCount) + BASE_GRID_HEIGHT_SHIM + shimAdjustment;

for (int i = 0; i < dataGridViewPlatypi.RowCount; i++)
{
    dataGridViewPlatypi.Rows[i].Height = newRowHeight;
}

dataGridViewPlatypi.Size = new Size(dataGridViewPlatypi.Width, newGridHeight);

注: 列 0 をクリックしても、行を押し上げて行 0 を非表示にし、DGV の柔らかい灰色の下腹部を明らかにすることはできません。この「押し上げ」が発生するのは、列の 1 つから次の列にタブ移動した後でのみです (FWIW)。

更新 2

これが私が豊富な答えを適用した方法です。

private void buttonAddRow_Click(object sender, EventArgs e)
{
    AddAPlatypusRow();
    for (int i = 0; i < dataGridViewPlatypi.RowCount; i++)
    {
        FreezeBand(dataGridViewPlatypi.Rows[i]);
    }
}
4

2 に答える 2

3

以下は、DataGridView の DataGridViewBand クラスを使用して任意の行または列を固定する完全なサンプルです。

要するに、必要なのは次のとおりです。

  1. FreezeBand を呼び出す( YouDataGridView.Rows[0])
  2. dataGridView.ColumnHeadersVisible = false;

注: 必要に応じて、バンドのBackColorをフリーズすることもできます。サンプルではWhiteSmoke(グレー)ですが。

    private static void FreezeBand(DataGridViewBand band)
    {
        band.Frozen = true;
        DataGridViewCellStyle style = new DataGridViewCellStyle();
        style.BackColor = Color.WhiteSmoke;
        band.DefaultCellStyle = style;
    }

完全なデモを見るには、Microsoft のDataGridViewBandDemoを参照してください。

高速なデモを表示するには、通常の Visual Studio、C# Windows アプリケーション プロジェクトを作成し、Program.cs ファイルに次のコードを入力します。

using System.Drawing;
using System.Windows.Forms;
using System;

public class DataGridViewBandDemo : Form
{
    #region "form setup"
    public DataGridViewBandDemo()
    {
        InitializeComponent();
        InitializeDataGridView();
    }

    DataGridView dataGridView;
    FlowLayoutPanel FlowLayoutPanel1 = new FlowLayoutPanel();

    private void InitializeComponent()
    {
        FlowLayoutPanel1.Location = new Point(454, 0);
        FlowLayoutPanel1.AutoSize = true;
        FlowLayoutPanel1.FlowDirection = FlowDirection.TopDown;
        AutoSize = true;
        ClientSize = new System.Drawing.Size(614, 360);
        FlowLayoutPanel1.Name = "flowlayoutpanel";
        Controls.Add(this.FlowLayoutPanel1);
        Text = this.GetType().Name;
    }
    #endregion

    #region "setup DataGridView"

    private void InitializeDataGridView()
    {
        dataGridView = new System.Windows.Forms.DataGridView();
        Controls.Add(dataGridView);
        dataGridView.Size = new Size(300, 200);

        // Create an unbound DataGridView by declaring a
        // column count.
        dataGridView.ColumnCount = 4;

        // Set the column header style.
        DataGridViewCellStyle columnHeaderStyle =
            new DataGridViewCellStyle();
        columnHeaderStyle.BackColor = Color.Aqua;
        columnHeaderStyle.Font =
            new Font("Verdana", 10, FontStyle.Bold);
        dataGridView.ColumnHeadersDefaultCellStyle =
            columnHeaderStyle;

        // Set the column header names.
        dataGridView.Columns[0].Name = "Recipe";
        dataGridView.Columns[1].Name = "Category";
        dataGridView.Columns[2].Name = "Whatever";
        dataGridView.Columns[3].Name = "Rating";

        // Populate the rows.
        string[] row1 = new string[]{"Meatloaf", 
                                        "Main Dish", "boringMeatloaf", "boringMeatloafRanking"};
        string[] row2 = new string[]{"Key Lime Pie", 
                                        "Dessert", "lime juice, evaporated milk", "****"};
        string[] row3 = new string[]{"Orange-Salsa Pork Chops", 
                                        "Main Dish", "pork chops, salsa, orange juice", "****"};
        string[] row4 = new string[]{"Black Bean and Rice Salad", 
                                        "Salad", "black beans, brown rice", "****"};
        string[] row5 = new string[]{"Chocolate Cheesecake", 
                                        "Dessert", "cream cheese", "***"};
        string[] row6 = new string[]{"Black Bean Dip", "Appetizer",
                                        "black beans, sour cream", "***"};
        string[] row7 = new string[]{"Black Bean Dip", "Appetizer",
                                        "black beans, sour cream", "***"};
        string[] row8 = new string[]{"Jelly beans", "Appetizer",
                                        "black beans, sour cream", "***"};
        string[] row9 = new string[]{"Barracuda", "Appetizer",
                                        "black beans, sour cream", "***"};
        object[] rows = new object[] { row1, row2, row3, row4, row5, row6, row7, row8, row9 };

        foreach (string[] rowArray in rows)
        {
            dataGridView.Rows.Add(rowArray);
        }

            dataGridView.ColumnHeadersVisible = false; // This hides regular column header
        FreezeFirstRow();
        // FreezeFirstColumn(); // Uncomment this line to freeze first column

    }

    // Freeze the first row.
    private void FreezeFirstRow()
    {
        FreezeBand(dataGridView.Rows[0]);
    }

    private void FreezeFirstColumn()
    {
        FreezeBand(dataGridView.Columns[1]);
    }

    private static void FreezeBand(DataGridViewBand band)
    {
        band.Frozen = true;
        DataGridViewCellStyle style = new DataGridViewCellStyle();
        style.BackColor = Color.WhiteSmoke;
        band.DefaultCellStyle = style;
    }

    #endregion

    [STAThreadAttribute()]
    public static void Main()
    {
        Application.Run(new DataGridViewBandDemo());
    }
}

まあ、それは私のベストショットです:)

于 2012-10-05T09:00:02.833 に答える
1

データバインドされた DGV を使用していないことは承知していますが、次のリンクのいずれかで解決策についての洞察が得られる場合があります。

于 2012-10-02T21:57:59.373 に答える