59170


お世話になります。

DataGridViewからDataGridViewRowを生成し、そこに名前を指定して値を  
セットしてからDataGridViewに追加するという、基本的なことをやりたいのですが、  
どうもうまくいきません。

コードを記述しますので、間違いを指摘していただければ幸いです。

[code]

    private void Form3_Load(object sender, EventArgs e)
    {
        this.dataGridView1.Columns.Clear();
    
        string[] stDefines = {
                "No_204","営_60","氏名_210","担当者名_120","開始_145","終了_145"
        };
    
        int idx = 0;
        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));
            col.DisplayIndex = idx;
            this.dataGridView1.Columns.Add(col);
            idx++;
        }
    
        this.Refresh();
    
        DataGridViewRow dgvr = new DataGridViewRow();
    
        dgvr.CreateCells(this.dataGridView1);
    
    　　// ↓ここでcolNoというcolumnNameはないといわれます
        dgvr.Cells["colNo"].Value = "0101010101010101";
    
       this.dataGridView1.Add(dgvr);
    }
    
[/code]

前半部分にて、各カラムに『col + 「名前」』として定義しているのですが、なぜか  
値を入れるときに名前がないというのですが、その理由がわかりません。

Rowの生成はうまくいっており、きちんと項目数も六個とみているのですが、実際に値を  
入れるときに失敗しています。

よろしくお願いいたします。


CC BY-SA 4.0
2019-09-17T05:13:08.683
59112
2019-09-20T06:42:14.743
2019-09-17T05:22:35.920
3060
9374
question
c# datagridview
C# DataGridViewへの行の追加について

[code]

    var index = dataGridView1.Add();
    var row = dataGridView1.Rows[index];
    row.Cells["colNo"].Value = "0101010101010101";
    
[/code]

でどうですか？


CC BY-SA 4.0
2019-09-17T13:23:03.580
59126
2019-09-17T13:23:03.580
4236
59112
answer


他者さまの検証結果をそのままURLを張りますが、仕様のようです。  
<https://jehupc.exblog.jp/12573968/>

元々、.NET WinForm向けコントロールのComboBoxやListBoxやDataGridViewなどは、  
DataSourceプロパティにList＜T＞、DataTable、BindingSourceいずれかを設定して使用する想定です。

特に、DataGridViewの場合はDataTableかBindingSourceをバインドする運用が推奨前提になっています。  
（ListジェネリックをDataSourceに設定してしまうと、読み取り専用になります。）

[code]

        // .designer.cs
    
        private DataGridView dataGridView1 = new DataGridView();
        private BindingSource bindingSource1 = new BindingSource();
    
        // .cs
    
        private DataTable srcRef;
    
        private void たとえばLoadCustomersとか()
        {
            // deginer側でバインド設定済みなら不要
            // dataGridView1.DataSource = bindingSource1;
            DataTable table = new DataTable();
            // 中略... DBやXmlやJsonからロードしてDataTableに詰め込むなど
            this.srcRef = table
            this.bindingSource1.DataSource = table;
    
        }
    
[/code]

このように、UIパーツ（DataGridView）と実データ（DataTable）にし、  
・ロジックからの操作は常にDataTableに直接変更を書ける  
・UI側からのイベントの場合も、そのArgのRowIndexやColIndexをもとに実データを取り出して変更をかける

などします


CC BY-SA 4.0
2019-09-17T13:57:44.593
59128
2019-09-17T13:57:44.593
25396
59112
answer


原因は下記通りです。  
CreateCellsメソッドは、行のDataGridViewCellCollectionをクリアし、 dataGridViewパラメーター
CellTemplateの各列の **プロパティで再初期化** します。

一般的の書き方でRowを追加

[code]

    int index=this.dataGridView1.Rows.Add();
    this.dataGridView1.Rows[index].Cells["colNo"].Value = "0101010101010101";
    
[/code]

特別な処理があるとき（セルにほかのコンポーネント利用する時）

[code]

    DataGridViewRow row = new DataGridViewRow();
    DataGridViewTextBoxCell textboxcell = new DataGridViewTextBoxCell();
    textboxcell.Value = "aaa";
    row.Cells.Add(textboxcell);
    dataGridView1.Rows.Add(row);
    
[/code]


CC BY-SA 4.0
2019-09-20T01:16:48.500
59170
2019-09-20T06:42:14.743
2019-09-20T06:42:14.743
35385
35385
59112
answer