1

データ グリッドにボタンを表示するインターフェイスを設計したいと思います - 毎日とその 24 時間。全体として、24 * 7 = 168 個のボタンが表示されます。

これを達成する方法はありますか?

4

2 に答える 2

1

ITypedListデータバインディングが理解できる方法で、構成メンバーごとに表示されるプロパティを直接指定できる、と呼ばれるフレームワークインターフェイスがあります。

この方法でバインディングを行おうとするのは絶対に恐ろしいことです。基本的な手順は次のとおりです。

  • を実装するコレクションタイプを実装しITypedListます;
  • コレクション内のアイテムごとPropertyDescriptorに、行と列のペアの値をカプセル化するaを返します。
  • 通常どおりコレクションにデータバインド

私はこれを実験として行いましたが、それは機能しますが、すべてを適切に機能させるためにジャンプする必要があるフープは悪夢です。それでも、私は通常、ビューロジックを直接操作するよりも優れていると考えています。DataGridViewは、バインディングから必要なすべてのことを推測できるほどインテリジェントであることが意図されており、コントロールではなくバインディングターゲットを変更できる場合は、それが望ましいです。

于 2012-09-16T11:54:12.287 に答える
1

それがどのように行われるかのサンプルコードを作成しました! このコードはボタンを作成するだけなので、チェックしてみてください: 注: ボタンに好きな名前を付けてください。

        dataGridView1.AllowUserToAddRows = false;
        for (int i = 0; i < 24; i++)
        {
            DataGridViewButtonColumn btnColumn = new DataGridViewButtonColumn();
            btnColumn.HeaderText = string.Format("{0}:00", i+1);
            btnColumn.Name = "dayColumn";
            btnColumn.Width = 40; //set yout width
            dataGridView1.Columns.Add(btnColumn);
        }
        for (int i = 0; i < 7; i++)
        {
            dataGridView1.Rows.Add();
            dataGridView1.Rows[i].HeaderCell.Value = (i + 1).ToString();
            for (int j = 0; j < dataGridView1.Columns.Count; j++)
            {
                dataGridView1[j, i].Value = string.Format("{0}:00", (j + 1));
            }
        }

--

いくつかのボタンがクリックされたときに、イベントハンドラーにサブスクライブすることをお勧めします。

    public Form1()
    {
        InitializeComponent();
        dataGridView1.AllowUserToAddRows = false;
        for (int i = 0; i < 24; i++)
        {
            DataGridViewButtonColumn btnColumn = new DataGridViewButtonColumn();
            btnColumn.HeaderText = string.Format("{0}:00", i+1);
            btnColumn.Name = "dayColumn";
            btnColumn.Width = 40; //set yout width
            dataGridView1.Columns.Add(btnColumn);
        }
        for (int i = 0; i < 7; i++)
        {
            dataGridView1.Rows.Add();
            dataGridView1.Rows[i].HeaderCell.Value = (i + 1).ToString();
            for (int j = 0; j < dataGridView1.Columns.Count; j++)
                dataGridView1[j, i].Value = string.Format("{0}:00", (j + 1));
        }
        dataGridView1.CellClick += new DataGridViewCellEventHandler(dataGridView1_CellClick);
    }

    private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
    {
        string day = dataGridView1.Rows[e.RowIndex].HeaderCell.Value.ToString();
        string hour = dataGridView1.Columns[e.ColumnIndex].HeaderText.ToString();
        MessageBox.Show("you have clciked on day: " + day + ", hour: " + hour);
    }
于 2012-09-15T13:33:39.890 に答える