none
CalendarCell を InitializeEditingControl() で編集状態にしたい RRS feed

  • 質問

  • 以下で紹介されている CalendarColumn を使い、DataGridView を作りました。


    - 方法 : Windows フォーム DataGridView Cells でコントロールをホストする

    - 確認画像


    SendKeys.Send("{F2}") で編集状態にできるのは分かったのですが、
    他のやり方として、
    EditingControl を初期化する public InitializeEditingControl() を使ってできないか
    試みています。


    - ダウンロード : サンプルコード


    コード ブロック

    private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
    {
      var cell = (DataGridViewCell)((DataGridView)sender)[e.ColumnIndex, e.RowIndex];
      var type = cell.GetType();


      if (type == typeof(DataGridViewTextBoxCell) || type == typeof(CalendarCell))
      {
        SendKeys.Send("{F2}");
      }
      else if (type == typeof(DataGridViewComboBoxCell))
      {
        SendKeys.Send("{F4}");
      }
    }


    private void edit_date_btn_Click(object sender, EventArgs e) ................... (1)
    {
      var grid = this.dataGridView1;
      var cell = grid.CurrentCell;
      var type = cell.GetType();


      if (type == typeof(CalendarCell))
      {
        var formattedValue = cell.FormattedValue;
        var style = cell.Style; .................................................... (2)


        cell.InitializeEditingControl(cell.RowIndex, formattedValue, style); ....... (3)
      }
    }

     

    Form1 上の "Edit date" ボタンを押すと (1) のメソッドが実行され、
    CalendarCell InitializeEditingControl() を (3) で呼び出すようにしています。


    今、以下のエラーが発生しています。


    コード ブロック
    System.InvalidOperationException はハンドルされませんでした。
      Message="オブジェクトの現在の状態に問題があるため、操作は有効ではありません。"

     

    (2) で取った InitializeEditingControl() の第3引数が悪いようなのです。


    第3引数 (dataGridViewCellStyle) を正常時とエラー発生時で比較すると以下
    の通りです。値はデバッガで取りました。


    ※ 正常時 .... マウスクリックや F2 キーで編集状態にした時


    正常時

    コード ブロック
    {
      DataGridViewCellStyle
      {
        BackColor=Color [Window],
        ForeColor=Color [ControlText],
        SelectionBackColor=Color [Highlight],
        SelectionForeColor=Color [HighlightText],
        Font=
        [
          Font: Name=MS UI Gothic,
          Size=9,
          Units=3,
          GdiCharSet=128,
          GdiVerticalFont=False
        ],
        NullValue=2008/01/19 12:16:40,
        Format=d,
        WrapMode=False,
        Alignment=MiddleLeft
      }
    }
    System.Windows.Forms.DataGridViewCellStyle

     


    エラー発生時

    var style = cell.Style とした場合

    {
      DataGridViewCellStyle
      {
        Format=d
      }
    }
    System.Windows.Forms.DataGridViewCellStyle

     

    var style = cell.OwningColumn.DefaultCellStyle とした場合
    {
      DataGridViewCellStyle
      {
        NullValue=2008/01/19 12:16:40
      }
    }

     

    var style = grid.DefaultCellStyle とした場合
    {
      DataGridViewCellStyle
      {
        BackColor=Color [Window],
        ForeColor=Color [ControlText],
        SelectionBackColor=Color [Highlight],
        SelectionForeColor=Color [HighlightText],
        Font=[
          Font: Name=MS UI Gothic,
          Size=9,
          Units=3,
          GdiCharSet=128,
          GdiVerticalFont=False
        ],
        WrapMode=False,
        Alignment=MiddleLeft
      }
    }
    System.Windows.Forms.DataGridViewCellStyle

     

     

    どうやったら正常時のような値が取れるのでしょう?

     

     

    + 2008-01-19

    そもそも InitializeEditingControl() で編集状態にする、

    という着目点が間違ってますかね?

    2008年1月19日 4:43

回答

  • すいませんが、最終的にどうされたいのかがわかりませんでした。
    編集モードにすることが目的でしたらすでにそうなっているようですし。
    エラーが発生しない場合、どうなることが望ましいのでしょうか?

     

    ちなみに編集モードへの移行は、DataGridView の BeginEdit メソッドが使えます。
    また、カレンダーをプルダウンさせるためには、編集モードになった後にコンボボックスと同様に F4 を SendKeys すればいいかと思います。

    2008年1月21日 7:23

すべての返信

  • すいませんが、最終的にどうされたいのかがわかりませんでした。
    編集モードにすることが目的でしたらすでにそうなっているようですし。
    エラーが発生しない場合、どうなることが望ましいのでしょうか?

     

    ちなみに編集モードへの移行は、DataGridView の BeginEdit メソッドが使えます。
    また、カレンダーをプルダウンさせるためには、編集モードになった後にコンボボックスと同様に F4 を SendKeys すればいいかと思います。

    2008年1月21日 7:23
  •  TH01 さんからの引用

    すいませんが、最終的にどうされたいのかがわかりませんでした。


    目的は、SendKeys 以外の手段でセルを編集状態に遷移させることです。


    CalendarCell を何らかのメソッドで編集状態にできないかなぁ、と考えていま
    した。InitializeEditingControl() がコントロールを編集状態にするメソッド
    じゃないのかと思い、いじってました。


     TH01 さんからの引用

    編集モードにすることが目的でしたらすでにそうなっているようですし。


    SendKeys.Send("{F2}") で編集状態にできるのは分かりましたが、それ以外の
    方法を模索しています。


     TH01 さんからの引用

    エラーが発生しない場合、どうなることが望ましいのでしょうか?


    あるメソッドの呼び出しにより、"年"/"月"/"日" が個々に編集できる状態にな
    るんじゃないかと。


     TH01 さんからの引用

    ちなみに編集モードへの移行は、DataGridView の BeginEdit メソッドが使えます。


    "BeginEdit" .... 試してみます。

     

    TH01 さん、サポートありがとうございます。

    2008年1月21日 10:11
  • InitializeEditingControl() は,

    呼ぶんではなく,呼ばれるメソッドです。

    なので,

    なにかカラクリを入れるんだったら,

    オーバーライドしている IntializeEditingControlメソッドそのもの(中身)が,

    カラクリを入れる場所になりますよね。

    2008年1月21日 13:23
  •  TH01 さんからの引用

    ちなみに編集モードへの移行は、DataGridView の BeginEdit メソッドが使えます。


    DataGridView.BeginEdit メソッド

    コード ブロック

      現在のセルを編集モードにします。

     

    あれま、あっさり。できちゃいました。


     

    yayadon さんのご指摘通り、私の InitializeEditingControl() に関する認識
    が違っていました。


    IDataGridViewEditingControl インターフェイス

    コード ブロック

    セルが編集モードに移行すると、次の手順が実行される

     

    DataGridView によって

      1. .... 編集コントロール型のインスタンスが作成
      2. .... セルの InitializeEditingControl メソッドが呼び出される
      3. .... 編集コントロールの ApplyCellStyleToEditingControl が呼び出される
      4. .... 編集コントロールの PrepareEditingControlForEdit が呼び出される

     


    全部 DataGridView が管理してるんですね。

     

    TH01 さん、yayadon さん、サポートありがとうございます。

    2008年1月21日 18:44