7

datagridviewがあり、次のことを実現しようとしています。1.垂直方向にスクロールしている間、一番上の行をフリーズする必要があります。2.最初の2列は、水平方向にスクロールしながらフリーズする必要があります。

column.Freeze = trueを適用しましたが、正常に機能していますが、row [0] .freeze = trueを適用すると、行のフリーズでは機能しません。

4

1 に答える 1

5

DataGridViewを作成するときは、それをDataTableに関連付け、すぐに最初の2行をフリーズするように設定します。行はフリーズしません。ただし、ボタンクリックを処理し、そのボタンクリックで行をフリーズするように設定すると、行は正常にフリーズします。それでは、テーブルを関連付けた直後に行をフリーズするにはどうすればよいですか?

ここにいくつかのコードがあります:

 DataTable dataTable = new DataTable();

    // Just add a bunch of columns
    for (int i = 0; i < 15; i++)
    {
    dataTable.Columns.Add("Col" + i.ToString(), typeof
    (string));
    }

    // Add a bunch of rows to the DataTable, with some dummy
    values
    for (int i = 0; i < 100; i++)
    {
    DataRow row = dataTable.NewRow();
    for (int j = 0; j < 15; j++)
    {
    row["Col" + j.ToString()] = "Val" + i.ToString() +
    "-" + j.ToString();
    }
    dataTable.Rows.Add(row);
    }

    gridView.DataSource = dataTable;

    gridView.Rows[1].Frozen = true;

これは機能しません。行はフリーズされません。gridView.Rows[1].Frozen = true;ただし、ボタンイベントハンドラーに行を貼り付けると、機能します。では、ユーザーからのイベントトリガーを必要とせずに、これをどのように行うのでしょうか。私は2つの解決策を見ます:

  1. 次のようにデータをバインドします。

    for (int i = 0; i < 15; i++)
    {
    DataGridViewTextBoxColumn c = new DataGridViewTextBoxColumn();
    c.Name = "Col" + i.ToString();
    gridView.Columns.Add(c);
    }
    gridView.Rows.Add(100);
    for (int i = 0; i < 100; i++)
    for (int j = 0; j < 15; j++)
    gridView.Rows[i].Cells[j].Value = "Val" + i.ToString() + "-" + j.ToString();
    gridView.Rows[0].Frozen = true;
    
  2. このイベントで凍結された行を選択します。

    private void gridView_DataBindingComplete(object sender,
    DataGridViewBindingCompleteEventArgs e)
    {
    FrozeFirstRow();
    }
    
于 2012-06-04T06:38:08.633 に答える