0

私は を持ってComboBoxColumnDataGridViewます。それをシングルクリックすると、同じ列の次または前の行に移動しますException(そしてアプリケーションがクラッシュします)。

これが私のコードです。どうすれば解決できますか?

private void cmbBox_SelectedIndexChanged(object sender, EventArgs e)
{
    try
    {
        // dgv_Panchang.EndEdit();
        string SpID = string.Empty;
        //ComboBox cmbBox = (ComboBox)sender;
        ComboBox cmbBox = new ComboBox();
        cmbBox = (ComboBox)sender;
        if (cmbBox != null)
        {

            if (dgv_Panchang.CurrentCell.ColumnIndex == 1)
            {
                Cls_Global_Var.Name = string.Empty;
                Cls_Global_Var.Name = cmbBox.SelectedItem.ToString();
                if (Cls_Global_Var.Name != string.Empty)
                {
                    Cls_Global_Var.StrSql = string.Empty;
                    Cls_Global_Var.StrSql = "select Pk_SpecialDay from    tbl_specialday where V_Title ='" + Cls_Global_Var.Name + "'";

                    SpID = Cls_DataBase.GetIdentCurrentID(Cls_Global_Var.StrSql);

                    if (SpID != null)
                    {
                        int RowIndex = dgv_Panchang.CurrentCell.RowIndex;
                        int ColIndex = dgv_Panchang.CurrentCell.ColumnIndex;
                        DataGridViewCell dgvCurrent = dgv_Panchang[ColIndex + 2, RowIndex];
                        if (dgvCurrent != null)
                        {
                            dgv_Panchang.CurrentCell = dgvCurrent;
                            dgv_Panchang.CurrentRow.Cells["SPDValue"].Value = SpID;

                            Cls_PanchangMaster_Obj.GetSpecialDayName(Convert.ToInt32(SpID), ColIndex, dgv_Panchang);
                        }

                    }
                }
                else
                {
                    return;
                }
            }
            else if (dgv_Panchang.CurrentCell.ColumnIndex == 4)
            {
                try
                {
                    Cls_Global_Var.Name = string.Empty;
                    Cls_Global_Var.Name = cmbBox.SelectedItem.ToString();
                    if (Cls_Global_Var.Name != string.Empty && Cls_Global_Var.Name != null)
                    {
                        Cls_Global_Var.StrSql = string.Empty;
                        Cls_Global_Var.StrSql = "select Pk_SpecialDay from  tbl_specialday where V_Title ='" + Cls_Global_Var.Name + "'";

                        SpID = Cls_DataBase.GetIdentCurrentID(Cls_Global_Var.StrSql);
                        if (SpID != null)
                        {
                            int RowIndex = dgv_Panchang.CurrentCell.RowIndex;
                            int ColIndex = dgv_Panchang.CurrentCell.ColumnIndex;
                            DataGridViewCell dgvCurrent = dgv_Panchang[ColIndex + 2, RowIndex];
                            if (dgvCurrent != null)
                            {
                                dgv_Panchang.CurrentCell = dgvCurrent;
                                dgv_Panchang.CurrentRow.Cells["SPDValue"].Value = SpID;

                                Cls_PanchangMaster_Obj.GetSpecialDayName(Convert.ToInt32(SpID), ColIndex, dgv_Panchang);
                            }

                        }
                    }
                }
                catch (Exception ex)
                {
                    Cls_GlobalMessage.CreatErrorLog(ex.Message.ToString());
                }
            }
        }
    }
    catch (Exception ex)
    {
        Cls_GlobalMessage.CreatErrorLog(ex.Message.ToString());
    }
    finally
    {
        dgv_Panchang.ClearSelection();
        dgv_Panchang.EndEdit();
    }
}
4

1 に答える 1

1

この質問はあまり聞かれず、問題を解決する回答が得られる可能性は低いです。コーディングに関する質問の仕方に関する一般的なガイドラインについては、http://tinyurl.com/so-hintsを参照してください。質問に多くの労力を費やすほど、回答者は質問に答えるために多くの労力を費やす可能性があります。これまでに提供された情報の量から、私たちが提供できる最善のことは.、null 値を持つ変数で演算子を使用しているため、おそらく例外であるということです。便利な権利;-)

そうは言っても、コードを少しクリーンアップするために実行できる他のいくつかの手順があります。最後に最初のトライキャッチから始めましょう。dgv_Panchangfinally ブロックを含む多くの場所で逆参照しています。それdgv_Panchangは決してnullではありませんか?null の場合、 を取得できますNullReferenceException。また、両方の catch ブロックが同じことをしているようです。おそらく、コードのセマンティクスを変更せずに内部の try-catch を削除できます (スタック トレースには、キャッチされた例外の行番号が異なる場合があります)。

先に進みます。多くの場所で、変数を新しいオブジェクトに設定し、すぐに別のものに設定しています。つまり、

ComboBox cmbBox = new ComboBox();
cmbBox = (ComboBox)sender;

Cls_Global_Var.Name = string.Empty;
Cls_Global_Var.Name = cmbBox.SelectedItem.ToString();

Cls_Global_Var.StrSql = string.Empty;
Cls_Global_Var.StrSql = "select Pk_SpecialDay from    tbl_specialday where V_Title ='" + Cls_Global_Var.Name + "'";

時間とメモリを節約するために、これらすべてのインスタンスで最初の行を削除できます。これは間違いではありませんが、単なるコード レビューの提案です。

Cls_Global_Var.Nameまたはなどの情報を格納するために、いくつかの静的グローバル クラスを使用しているようCls_Global_Var.StrSqlです。おそらく静的なしでこれを処理するより良い方法があり、該当する場合はマルチスレッドの問題にも注意する必要がありますが、それは問題が大きすぎて、ここで議論するよりも多くのコンテキストが必要です.

dgv_Panchang.CurrentCell.ColumnIndex == 1whenと when itのコード4は非常に似ています。前に述べたように、おそらく必要ない、後者の追加の try-catch を除いて、唯一の違いは if ステートメントの余分な句にあります。

Cls_Global_Var.Name = cmbBox.SelectedItem.ToString();
if (Cls_Global_Var.Name != string.Empty && Cls_Global_Var.Name != null)

.ToString()null を返すことはないため&& Cls_Global_Var.Name != null、 は不要であり、削除できます。(補足として、調べてくださいstring.IsNullOrEmpty()

それを削除すると、2 つのコード ブロックは同じ意味になり、if ステートメントを次のように要約できます。

if (dgv_Panchang.CurrentCell.ColumnIndex == 1 || dgv_Panchang.CurrentCell.ColumnIndex == 4)

このように LOC カウントを短縮することは良いことです。

もう 1 つの批判: あなたのコンボ ボックスが生のユーザー入力を許可しないことを願っています"';DROP TABLE tbl_specialday;--"。SQL パラメーターを調べて、コードをより堅牢にします。

于 2012-05-23T17:41:26.790 に答える