none
データベースに連結したDataGridViewのNull値を許容しない複数の列の一部だけにデータを入力してフォームを閉じたときのエラーへの対処法は? RRS feed

  • 質問

  • VS2008(Pro)と組み合わせるデータベースをAccessからSQL SERVER Compact に変えて使用していて「今までに出会わなかったエラー」なものですから戸惑っています。
    NULL値を許容しない列が、ID,group、No、name、name_kanaの4列があり、たとえば’ID’列のみに307と入力してフォームの×印をクリックしてフォームを閉じたとき、
    「列’group’にNullをしようすることはできません」とのエラーになります。

    *.mdbのときには単に、
         private void button1_Click(object sender, EventArgs e)
             {
                 this.Close();
             }
    で間に合っており、データベースSQL Server Compact 3.5の*.sdf固有の「フォームを閉じるときのエラー」のように思えるのですが、どうなのでしょうか。

    下のようにもかんがえては見たのですが
        private void frmMeibo_FormClosing(object sender, FormClosingEventArgs e)
            {
                //meiboBindingSource.EndEdit();ではなく
          //データベースとの接続を断つことが必要なのだろうか?として、そのことをどのように書けばよいのか!?
            }
    対処法をお教え願います。

            private void Form1_Load(object sender, EventArgs e)
            {
                //データを 'chonaikaiDBDataSet.meibo' テーブルに読み込みます。
                this.meiboTableAdapter.Fill(this.chonaikaiDBDataSet.meibo);
            }
    
            // 次のセルに移動する為、Tabキーストロークを送る。
            protected override bool ProcessCmdKey(ref Message msg, System.Windows.Forms.Keys keyData)
            {
                const int WM_KEYDOWN = 0x100;
                const int WM_SYSKEYDOWN = 0x104;
    
                //未入力のときの移動先の列番号
                int colNum = -1;
    
                if ((msg.Msg == WM_KEYDOWN) || (msg.Msg == WM_SYSKEYDOWN))
                {
                    switch (keyData)
                    {
                        case Keys.Enter:        // Enterキー操作
                            //最終列でないとき
                            if (dataGridView1.CurrentCell.ColumnIndex
                                != dataGridView1.ColumnCount - 1)
                            {
                                SendKeys.Send("{Tab}");
                                return true;
                            }
                            //最終列のとき
                            else
                            {
                                //「キー列などNull値が許容されていない列」に値がセットされているとき
                                if (dataGridView1[0, dataGridView1.CurrentCell.RowIndex].Value.ToString() != string.Empty
                                    && dataGridView1[1, dataGridView1.CurrentCell.RowIndex].Value.ToString() != string.Empty
                                    && dataGridView1[2, dataGridView1.CurrentCell.RowIndex].Value.ToString() != string.Empty
                                    && dataGridView1[3, dataGridView1.CurrentCell.RowIndex].Value.ToString() != string.Empty
                                    && dataGridView1[4, dataGridView1.CurrentCell.RowIndex].Value.ToString() != string.Empty)
                                {
                                    //次の行の先頭に移動
                                    dataGridView1.CurrentCell
                                        = dataGridView1[colNum, dataGridView1.CurrentCell.RowIndex + 1];
                                }
                                //「キー列などNull値が許容されていない列」に値がセットされていないとき
                                else
                                {
                                    string strMsg = "";
    
                                    if (dataGridView1[0, dataGridView1.CurrentCell.RowIndex].Value.ToString() == string.Empty)
                                    {
                                        strMsg += "[コード番号],";
                                        colNum = 0;
                                    }
                                    if (dataGridView1[1, dataGridView1.CurrentCell.RowIndex].Value.ToString() == string.Empty)
                                    {
                                        strMsg += "[班名],";
                                        if (colNum != 0) colNum = 1;
                                    }
                                    if (dataGridView1[2, dataGridView1.CurrentCell.RowIndex].Value.ToString() == string.Empty)
                                    {
                                        strMsg += "[会員番号],";
                                        if (colNum != 0 && colNum != 1) colNum = 2;
                                    }
                                    if (dataGridView1[3, dataGridView1.CurrentCell.RowIndex].Value.ToString() == string.Empty)
                                    {
                                        strMsg += "[氏名],";
                                        if (colNum != 0 && colNum != 1 && colNum != 2) colNum = 3;
                                    }
                                    if (dataGridView1[4, dataGridView1.CurrentCell.RowIndex].Value.ToString() == string.Empty)
                                    {
                                        strMsg += "[フリガナ]";
                                        if (colNum != 0 && colNum != 1 && colNum != 2 && colNum != 3) colNum = 4;
                                    }
                                    //現在の行で、一番左の未入力のセルに移動
                                    MessageBox.Show(strMsg + "\n" + "\n" + "の列が未入力です。", "ChonaikaiSuito");
                                    dataGridView1.CurrentCell
                                        = dataGridView1[colNum, dataGridView1.CurrentCell.RowIndex];
                                }
                                return true;
                            }
                    }
                }
                return base.ProcessCmdKey(ref msg, keyData);
            }
    


    zen73
    2009年8月8日 20:08

回答

  • 10年前からDataSetやDataGridを使っていたわけではありませんよね?
    「よろしくおねがいします」というのは破棄するためにどのようなメソッドを呼べばいいのか、ご自身では一切調ない、調べてほしいという依頼でしょうか?
    探せばすぐ見つかると思いあえてあげなかったのですが。
    • 回答としてマーク zen73 2009年8月9日 3:20
    2009年8月9日 1:42

すべての返信

  • で間に合っており、データベースSQL Server Compact 3.5の*.sdf固有の「フォームを閉じるときのエラー」のように思えるのですが、どうなのでしょうか。
    meiboBindingSourceが書き込もうとしているのは事実ですが、それはなぜか?ということです。meiboBindingSourceが勝手に動作することはなく、誰かの指示です。
    それが誰なのかというとchonaikaiDBDataSetでありdataGridView1でしょう。
    つまり入力中の値を破棄すれば、meiboBindingSourceが書き込むことはなくなります。
    こう考えると、SQL Server Compact固有の問題ではなく、単に今まではタイミングの関係で発生していなかっただけに思います。
    ところで、入力中の値を破棄してもいいのでしょうか?
    2009年8月8日 23:12
  • こう考えると、SQL Server Compact固有の問題ではなく、単に今まではタイミングの関係で発生していなかっただけに思います。
    そういうことだったのですか。今までの10年間(今だに初心者の域を脱し得ないのですが)思いもしませんでした。
    ところで、入力中の値を破棄してもいいのでしょうか?
    はい。入力中の値は破棄してもいいのです。そうでない場合は、「更新ボタン」をおいて更新処理をしようと思います。

    よろしくおねがいします。
    zen73
    2009年8月8日 23:49
  • 10年前からDataSetやDataGridを使っていたわけではありませんよね?
    「よろしくおねがいします」というのは破棄するためにどのようなメソッドを呼べばいいのか、ご自身では一切調ない、調べてほしいという依頼でしょうか?
    探せばすぐ見つかると思いあえてあげなかったのですが。
    • 回答としてマーク zen73 2009年8月9日 3:20
    2009年8月9日 1:42
  • 佐祐理さん、あまりにも頼りすぎていました。反省しています。

    以下のDataErrorイベントで解決できました。ありがとうございました。

        private void dataGridView1_DataError(object sender, DataGridViewDataErrorEventArgs e)
            {
                e.Cancel = false;
            }
    zen73
    2009年8月9日 3:25