0

フォームに 2 ページの TabControl があります。各ページにはデータグリッドビューが含まれています。イベントではForm.Load、データベースの SQL からデータグリッドビューを埋め、それらのグリッドの列幅の一部を変更しています。

 DataTable GLOBAL_TABLE = new DataTable();
    object[] GLOBAL_PARAMETERS = new object[50];

    private void frmMAIN_Load(object sender, EventArgs e)
    { 
        LOAD_TAB_1();
        LOAD_TAB_2();
    }

    void LOAD_TAB_1()
    {
        //SQLRELATION class contain method that execute stored procedure on server 
        //and return DataTAble
        Array.Clear(GLOBAL_PARAMETERS, 0, GLOBAL_PARAMETERS.Length);
        GLOBAL_PARAMETERS[0] = userID;
        GLOBAL_PARAMETERS[1] = date_1.Date;
        GLOBAL_PARAMETERS[2] = date_2.Date;
        GLOBAL_TABLE = SQLRELATION.GET_PROCEDURE("PROC023", GLOBAL_PARAMETERS, true);
        dgv_MAIN_substitution.DataSource = GLOBAL_TABLE;

        //Here I'm changing my columns width
        foreach (DataGridViewColumn col in dgv_MAIN_substitution.Columns)
        {
            switch (col.Name)
            {
                case "Dummy": col.Width = 30; break;
                case "MOQ": col.Width = 30; break;
                case "Inactive": col.Width = 30; break;
                default: break; 
             }
         }
    }

    void LOAD_TAB_2()
    {
        //The same I'm doing for the second datagridview 
        Array.Clear(GLOBAL_PARAMETERS, 0, GLOBAL_PARAMETERS.Length);
        GLOBAL_PARAMETERS[0] = userID;
        GLOBAL_PARAMETERS[1] = date_1.Date;
        GLOBAL_PARAMETERS[2] = date_2.Date;
        GLOBAL_TABLE = SQLRELATION.GET_PROCEDURE("PROC023", GLOBAL_PARAMETERS, true);
        dgv_MAIN_orders.DataSource = GLOBAL_TABLE;

        //Changing my columns width for second datagrigview
        foreach (DataGridViewColumn col in dgv_MAIN_orders.Columns)
            {
                switch (col.Name)
                {
                    //Error if HERE!
                    case "Status": col.Width = 30; break;
                    case "PO Number": col.Width = 150; break;                        
                    default: col.Width = 40; break;
                }        
             }
      }

私のデータグリッドビューは両方ともデータベースからデータを取得しています。私の最初のデータグリッドビューでは、すべて問題ありません。しかし、2 番目の TabPage で 2 番目の datagridview の列幅を変更しようとすると、メッセージが表示されますObject reference not set to an instance of an object。しかし、なぜ?以下のスクリーンショットでは、2 番目の datagridview に列名が存在することがわかりますが、列幅を変更することはできません。

エラーのスクリーンショット

私が間違っていることは何ですか?私のデータグリッドは空ではなく、データが含まれています。最初に TabPage などをアクティブにする必要がありますか?

4

3 に答える 3

7

私も同じ問題を抱えていました。どうやらコントロールが表示されないためにクラッシュが発生するようです。フォームの Shown() イベントで幅を設定すると、うまくいきました。

于 2012-11-09T21:57:07.840 に答える
4

自分で試してみたところ、問題を再現できませんでした。ただし、事前に列名を知っている場合は、次のアプローチを使用します。

dgv_MAIN_substitution.Columns["Dummy"].Width = 30;
dgv_MAIN_substitution.Columns["MOQ"].Width = 30;
dgv_MAIN_substitution.Columns["Inactive"].Width = 30;

dgv_MAIN_orders.Columns["Status"].Width = 30;
dgv_MAIN_orders.Columns["PO Number"].Width = 150;

これは foreach ループや switch ステートメントよりもクリーンです。もう 1 つできることは、Column.AutoSizeMode を設定することです。

dgv_MAIN_orders.Columns["PO Number"].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;

介入なしで自動的に幅を調整するようにします。

于 2012-08-08T14:37:01.070 に答える