データ グリッドにボタンを表示するインターフェイスを設計したいと思います - 毎日とその 24 時間。全体として、24 * 7 = 168 個のボタンが表示されます。
これを達成する方法はありますか?
ITypedList
データバインディングが理解できる方法で、構成メンバーごとに表示されるプロパティを直接指定できる、と呼ばれるフレームワークインターフェイスがあります。
この方法でバインディングを行おうとするのは絶対に恐ろしいことです。基本的な手順は次のとおりです。
ITypedList
ます;PropertyDescriptor
に、行と列のペアの値をカプセル化するaを返します。私はこれを実験として行いましたが、それは機能しますが、すべてを適切に機能させるためにジャンプする必要があるフープは悪夢です。それでも、私は通常、ビューロジックを直接操作するよりも優れていると考えています。DataGridViewは、バインディングから必要なすべてのことを推測できるほどインテリジェントであることが意図されており、コントロールではなくバインディングターゲットを変更できる場合は、それが望ましいです。
それがどのように行われるかのサンプルコードを作成しました! このコードはボタンを作成するだけなので、チェックしてみてください: 注: ボタンに好きな名前を付けてください。
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);
}