59065
お世話になります。

VS2019Community VC#のフレームワーク4.5です。

DataGridViewに、カラムをコード上で初期化しようとコードを書いているのですが、  
並ぶ順番が思う通りにいかずに悩んでいます。

DataGridViewのColumnsにAddしていけば、Addした順に左から並ぶはずなのですが、  
Addの際にifで条件分岐すると、順番が末尾に来てしまいます。  
以下が、そのコード部分です。

```

        //　　継承元
        protected DataGridViewButtonColumn status
                    = new DataGridViewButtonColumn()
        {
            Name = "状態",
            Width = 200,
        };
    
        public virtual void set(bool editable)
        {
            this.dgv.Columns.Clear();
    
            string[] stDefines = {
                "No_204","営_60","StaffNo_110","氏名_210","担当者名_120","開始_145","終了_145"
            };
    
            foreach (string s in stDefines)
            {
                DataGridViewTextBoxColumn col = new DataGridViewTextBoxColumn();
                col.HeaderText = s.Substring(0, s.IndexOf("_"));
                col.Name = "col" + s.Substring(0, s.IndexOf("_"));
                col.ReadOnly = true;
                col.Width = int.Parse(s.Substring(s.IndexOf("_") + 1));
                this.dgv.Columns.Add(col);
            }
    
            if(editable)
            {
                //  末尾に『状態』ボタンを追加する
                this.dgv.Columns.Add(this.status);
            }
        }
    
        //　継承先
        private DataGridViewButtonColumn detail = new DataGridViewButtonColumn()
        {
            Name = "詳細",
            Width = 80,
        };
    
        public override void set(bool editable)
        {
            // this.dgvはDataGridViewです。
            this.dgv.Columns.Clear();
    
            string[] stDefines = {
                "No_204","営_60","企業名 & 部門名_320","担当者名_120","開始_145","終了_145",
            };
    
            foreach (string s in stDefines)
            {
                DataGridViewTextBoxColumn col = new DataGridViewTextBoxColumn();
                col.HeaderText = s.Substring(0, s.IndexOf("_"));
                col.Name = "col" + s.Substring(0, s.IndexOf("_"));
                col.ReadOnly = true;
                col.Width = int.Parse(s.Substring(s.IndexOf("_") + 1));
                this.dgv.Columns.Add(col);
            }
    
    　　　　// ここです!
            if (editable)
            {
                this.dgv.Columns.Add(this.status);
            }
    
            this.dgv.Columns.Add(this.detail);
        }
    
```

引数editableにtrueを渡してやることで、『状態』ボタンのColumnを追加する流れです。  
しかし、いろいろ試してのですが、どうしても後に追加しているdetailが最初に来てしまい、  
ifで追加しているはずのstatusがdetailの右側に来てしまいます。  
順番通りであれば、statusの次にdetailが来るはずなのですが…。

ちなみに、ifを除いて必ずstatusが入る処理にすれば、正しく順番通りになります。

原因と対策をお教えいただけますでしょうか。

よろしくお願いいたします。
CC BY-SA 4.0
2019-09-14T07:04:23.420
59060
2019-09-14T15:41:53.317
2019-09-14T15:41:53.317
76
9374
question
c# datagridview
DataGridViewの初期設定でColumnの順番が思う通りにいかない
`Columns`プロパティはカラムの並び順を示すものではありません。これは[`DataGridView.AllowUserToOrderColumns`プロパティ](https://docs.microsoft.com/ja-
jp/dotnet/api/system.windows.forms.datagridview.allowusertoordercolumns?view=netframework-4.8)によりユーザーがカラムヘッダーのドラッグ＆ドロップで順序を変更できるようにするためです。  
明示的にカラムの順序を指定したい場合は、[`DataGridViewColumn.DisplayIndex`プロパティ](https://docs.microsoft.com/ja-
jp/dotnet/api/system.windows.forms.datagridviewcolumn.displayindex?view=netframework-4.8#System_Windows_Forms_DataGridViewColumn_DisplayIndex)で指定します。
CC BY-SA 4.0
2019-09-14T11:26:08.557
59065
2019-09-14T11:26:08.557
4236
59060
answer