0

2 つの DataGridView を持つ .NET 3.5 をターゲットとする C# WinForms プロジェクトがあります。Win 7 64 ビットの Visual Studio 2010 Pro。

実行時に作成された 2 つの DateTimePicker コントロール (時刻用と日付用) を使用しています。これらは、グリッドビューの適切な DateTime セルの上に浮かんでいます。ピッカーは、時刻または日付のセルがフォーカスされたときにのみ表示されます。

システム時刻の形式は 24 時間です。

private DateTimePicker timePicker;

timePicker = new DateTimePicker();
timePicker.Format = DateTimePickerFormat.Custom;
timePicker.CustomFormat = "HH:mm";
timePicker.MaxDate = new DateTime(9998, 12, 31);
timePicker.MinDate = new DateTime(1753, 01, 01);
timePicker.ShowUpDown = true;
timePicker.Width = 60;
timePicker.Hide();
timePicker.ValueChanged += new EventHandler(timePicker_ValueChanged);
timePicker.KeyPress += new KeyPressEventHandler(timePicker_KeyPress);
timePicker.LostFocus += new EventHandler(timePicker_LostFocus);
dgTxSummary.Controls.Add(timePicker);

void timePicker_ValueChanged(object sender, EventArgs e)
{
   // dgTxSummary is the DataGridView containing the dates and times
   dgTxSummary.CurrentCell.Value = timePicker.Value;            
}

void timePicker_LostFocus(object sender, EventArgs e)
{
   timePicker.Hide();
}

// Used for debugging; shows a message in a text field when 10, 20 etc
// where entered
void timePicker_KeyPress(object sender, KeyPressEventArgs e)
{
   if (Char.IsDigit(prevChar) && e.KeyChar == '0')
   {
      string correctHour = prevChar.ToString() + '0';
      Message = "Should have been " + correctHour;
   }

   prevChar = e.KeyChar;
}

時間セルをクリックすると、タイムピッカーが表示されます

private void ShowTimePicker(Point cellPos, DateTime dt)
{
  timePicker.Location = cellPos;
  timePicker.Value = dt;
  timePicker.Show();
  timePicker.Focus();
}

この問題は、次の 2 つの条件が満たされた場合にのみ発生します。

1) ピッカーがフォーカスを得た後に最初に数値が入力されたとき
2) 0* で終わる有効な数値が手動で入力された (キーボード)

※時は0、10、20、分は0、10、…、50

アップダウン ボタンを使用すると正常に動作します。

その結果、最初に前の時刻または日付が表示され、アップダウン ボタンが消え、コントロール (タイムピッカー) が非表示または閉じられ、datagridview 内の基になるセルにフォーカスがあり、前の時刻または日付で編集モードになります。セルの内側または外側をクリックすると、10 が入力された場合は 01 が表示されます。

同じフォームでデザインタイムの datetimepicker を作成しましたが、正常に動作します。

私は何が欠けていますか?

4

1 に答える 1

0

私はついにコードの犯人を見つけました:

dgTxSummary.Controls.Add(timePicker);

DataGridViewではなく、 DateTimePicker をフォームに追加する必要があるようです。

コードを変更してthis.Controls.Add(timePicker);使用datePicker.BringToFront();した後ShowTimePicker(...)(コントロールが DataGridView の背後に隠れないようにするため)、すべて問題ありません:-)

FWIW 次のコードを使用して、DateTimePicker を対応するセルの上に配置します (エラー処理、null チェックなどを取り除いたコード):

private void dgTxSummary_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
    Rectangle cellRect = dgTxSummary.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, false);
    Point dgPos = dgTxSummary.Location;
    Point cellPos = new Point(dgPos.X + cellRect.X, dgPos.Y + cellRect.Y);

    DateTime dt = DateTime.Parse(row.Cells[e.ColumnIndex].FormattedValue.ToString());

    ShowDatePicker(cellPos, dt);
}
于 2012-06-08T10:18:20.253 に答える