none
振り仮名を自動入力-DataGridView RRS feed

  • 質問

  •  

    下でも教えていただいたのですが、

    http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=3454840&SiteID=7

    これですと、「姓」と「名前」を同時に入力しないと、「セイ」+「ナマエ」でフリガナを表示できません。

     

    それで、DOBON NETさん、http://dobon.net/vb/dotnet/datagridview/textboxevent.html

    のコードをお借りして、以前にVS2002で正常に動作していたものをVS2005で

    書き換えてみたのですが、下のようになってうまく表示できなくなってしまいました。

    ---------------------------------------------------------------------------------------------------

    1列目     2列目

    赤井 秀和  アカイ ヒデカズ

    *1行目はうまくいきます

    ---------------------------------------------------------------------------------------------------

    1列目     2列目    3列目

    赤井 秀和  アカイ ヒデカズ アカイ ヒデカズ

    *2行目に「い」と入力しただけで3列目に

    ---------------------------------------------------------------------------------------------------

    1列目     2列目    3列目

    赤井 秀和  アカイ ヒデカズ アカイ ヒデカズイワキ コウイチ

    岩城 晃一

    ---------------------------------------------------------------------------------------------------

    1列目     2列目    3列目          4列目

    赤井 秀和  アカイ ヒデカズ アカイ ヒデカズイワキ コウイチ アカイ ヒデカズイワキ コウイチ

    岩城 晃一

    ---------------------------------------------------------------------------------------------------

    1列目     2列目    3列目          4列目

    赤井 秀和  アカイ ヒデカズ アカイ ヒデカズイワキ コウイチ アカイ ヒデカズイワキ コウイオダ カズマサ

    岩城 晃一

    小田 和正

     

    改善策として…

    ア 文字列変数Furiganaを空っぽにするタイミング

    イ フリガナを表示するセル位置を指定しなおすタイミング

    を考えないといけないのですが、まったくアイディアが浮かばず困っています。

     

    丸投げ状態で申し訳ないのですが、お教えいただけないでしょうか。

    Code Snippet

    using System;
    using System.Windows.Forms;
    using System.Text.RegularExpressions;
    using System.Data;
    using System.Text;
    using System.Runtime.InteropServices;

    namespace dgv_Furigana
    {
        public partial class Form1 : Form
        {
            public string Furigana = "";
            const int GCS_RESURTREADSTR = 0x0200;

            [DllImport("imm32.dll")]
            static extern IntPtr ImmGetContext(IntPtr hWnd);
            [DllImport("imm32.dll")]
            static extern int ImmGetCompositionString(
                IntPtr hiMC, int dwIndex, StringBuilder lpBuf, int dwBufLen);
            [DllImport("imm32.dll")]
            static extern bool ImmReleaseContext(IntPtr hWnd, IntPtr hiMC);

            //KeyPressで入力された数値
            public string TempChr = "";


            public Form1()
            {
                InitializeComponent();
            }
            private void Form1_Load(object sender, EventArgs e)
            {
                //this.dataGridTextBoxColumn1.TextBox.KeyDown
                //            += new KeyEventHandler(this.Name_KeyPress);
            }
            private void dataGridView1_EditingControlShowing(object sender,
                DataGridViewEditingControlShowingEventArgs e)
            {
                if (e.Control is DataGridViewTextBoxEditingControl)
                {
                    DataGridView dgv = (DataGridView)sender;
                    DataGridViewTextBoxEditingControl tb =
                        (DataGridViewTextBoxEditingControl)e.Control;
                    //tb.KeyPress -=
                    //    new KeyPressEventHandler(Name_KeyPress);
                    tb.KeyDown -=
                        new KeyEventHandler (Name_KeyPress );
                     if(dgv.CurrentCell .OwningColumn .Name =="Column1")
                    {
                        tb.KeyDown +=
                            new KeyEventHandler(Name_KeyPress);
                    }
                }
            }

            //DataGridでフリガナ
            private void Name_KeyPress(object sender,
                System.Windows.Forms.KeyEventArgs e)
            {
                string tmpStr;
                //int iCol = dataGridView1.CurrentCell.ColumnIndex;
                //int iRow = dataGridView1.CurrentCell.RowIndex;
                IntPtr himc = ImmGetContext(dataGridView1.Handle);

                if (himc == IntPtr.Zero
                    || e.KeyCode == Keys.Back
                    || e.KeyCode == Keys.Left || e.KeyCode == Keys.Shift)
                {
                    return;
                }
                try
                {
                    int dwSize
                        = ImmGetCompositionString(himc, GCS_RESURTREADSTR, null, 0);
                    StringBuilder lpBuf = new StringBuilder(dwSize);

                    ImmGetCompositionString(himc, GCS_RESURTREADSTR, lpBuf, dwSize);
                    lpBuf.Length = dwSize;
                    tmpStr = lpBuf.ToString();
                    Furigana += tmpStr;
                    dataGridView1[iRow + 1, iCol].Value = Furigana;
                   
                }
                finally
                {
                    //ImmReleaseContext(dataGrid1.Handle, himc);
                    ImmReleaseContext(dataGridView1.Handle, himc);
                }
            }

     

     

    2009年1月23日 0:56

回答

  • iColもiRowも加算系ではないので、特にクリアする必要はないでしょう。(単に代入されているだけですので)

    むしろ、dataGridView1[iRow + 1, iCol]の行と列の指定が逆です。dataGridView1[iCol + 1, iRow]でいいのでは?

     

    2009年1月23日 3:10
    モデレータ

すべての返信

  •  zen73 さんからの引用

    ア 文字列変数Furiganaを空っぽにするタイミング

    イ フリガナを表示するセル位置を指定しなおすタイミング

    を考えないといけないのですが、まったくアイディアが浮かばず困っています。

     

    DataGridViewのCellEndEditイベントで行ってみてはいかがでしょうか?

    2009年1月23日 1:43
    モデレータ
  • trapemiyaさん、ありがとうございます。

    (ずうっと以前にも同様のことで、いろいろ教えていただいたような気がします。もしかすると同じことをお聞きしていたなんてことが!?。年をとると記憶があいまいになってしまいます。)

    Code Snippet

    private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
            {
                Furigana = "";
                //iCol = 0;
                //iRow = 0;
            }

     

     

    文字列変数Furiganaを空っぽにすることができました。

    ---------------------------------------------------------------------------------------------------

    1列目     2列目     3列目    4列目

    赤井 秀和  アカイ ヒデカズ  イワキ コウイチ  オダ カズマサ

    岩城 晃一

    小田 和正

    ---------------------------------------------------------------------------------------------------

    <フリガナを表示する位置の指定>が難題です。

     

    2009年1月23日 2:16
  • iColもiRowも加算系ではないので、特にクリアする必要はないでしょう。(単に代入されているだけですので)

    むしろ、dataGridView1[iRow + 1, iCol]の行と列の指定が逆です。dataGridView1[iCol + 1, iRow]でいいのでは?

     

    2009年1月23日 3:10
    モデレータ
  • できました!!。

    trapemiyaさん、ありがとうございました。

    ---------------------------------------------------------------------------------------------------

    1列目     2列目    

    赤井 秀和  アカイ ヒデカズ 

    岩城 晃一  イワキ コウイチ  

    小田 和正  オダ カズマサ

    ---------------------------------------------------------------------------------------------------

    VS2002からVS2005に変わったときの仕様変更だったのでしたね。

    とにかく、とても助かりました。重ねてお礼申します。

     

     

    2009年1月23日 4:01