0

次の方法を使用して作成された行の違いを理解しようとしています。

newTable.Rows.Add(array);

newTable.ImportRow(row);  

これらの両方のメソッドを使用してDataTableに行を追加するWinFormsアプリがあります。そのDataTableをDataGridViewのデータソースとして使用すると、両方のメソッドを使用して作成されたすべての行を確認できます。ただし、このタイプのループを使用する場合

foreach (DataRow row in newTable.Rows)
{
    //...do work
}

ループは、ImportRowメソッドを使用して作成された行のみを「認識」します。Rows.Add(array)を使用して作成された行は存在しないかのようですが、DataTableをデータソースとして使用するとDataGridViewで表示できるため、明らかに存在します。

編集(Rahil Jan Muhammadによるコメントに続く)

はい-たくさん遊んだ後、行追加メソッドはそれとは何の関係もないと思います。問題は次のコードにあります:

foreach (DataGridViewColumn col in dataAllocations.Columns)
{
    if (col.Name == "Allocation")
    {
        col.ReadOnly = false;
    }
    else
    {
        col.ReadOnly = true;
    }
}  
foreach (DataGridViewRow row in dataAllocations.Rows)
{
    MessageBox.Show("DataGrid, " + row.Cells["AllocID"].Value.ToString() +
                                ", " + row.Cells["Active"].Value.ToString());

    if (row.Cells["Active"].Value == null || (bool)row.Cells["Active"].Value == false)
    {                        
         row.ReadOnly = true;
    }
    else
    {
         row.ReadOnly = false;
    }
}

最初のループでは、列「割り当て」を除くすべての列が読み取り専用になります。2番目のループは、列「アクティブ」の値がfalseの場合に、列「割り当て」を読み取り専用にすることを目的としています。しかし、起こっていることは正反対です。Activeがtrueである行は読み取り専用であり、その逆も同様です。そうです、私の「if」ステートメントに何か問題があります。しかし、何ですか?

4

4 に答える 4

1

私はあなたの問題を見つけました(ログエラー):

foreach (DataGridViewRow row in dataAllocations.Rows)
{
 MessageBox.Show("DataGrid, " + row.Cells["AllocID"].Value.ToString() +
                            ", " + row.Cells["Active"].Value.ToString());

if (row.Cells["Active"].Value == null || (bool)row.Cells["Active"].Value == false)
{                        
     row.Cells["Allocation"].ReadOnly = true;
}
else
{
     row.Cells["Allocation"].ReadOnly = false;
}

}

あなたのコードはすべての行の列を読み取り専用に設定します.読み取り専用の割り当て列を設定したい(私のコード)。

于 2012-08-17T02:46:18.390 に答える
1

datatable.Rows.Add() 新しいレコードをデータセットに追加するには、新しいデータ行を作成し、データセット内の DataTable の DataRow コレクション ( Rows) に追加する必要があります

DataTableのImportRowメソッドは、行のすべてのプロパティとデータを含む行を DataTable にコピーします。実際には、現在のテーブル スキーマを使用して宛先 DataTable の NewRow メソッドを呼び出し、DataRowState を Added に設定します。

于 2012-08-17T03:24:19.067 に答える
0

Rows.Add と ImportRow の違いは、Rows.Add を呼び出すと、行が追加済みとしてマークされることです (そのため、テーブルをデータ アダプターに送信すると、挿入が生成されます)。行のインポートを使用すると、行は入りますが、「挿入済み」の状態ではなく、挿入は生成されません。

ただし、AddRow で説明している動作を再現することはできません。それらは foreach に表示されます。

以下のテスト コード (これは LINQpad からのものです。それがない場合は、.Dump() 呼び出しを Console.Write に変更できます):


var dt = new DataTable();
dt.Columns.Add("C1", typeof(int));
for(int i = 0; i < 10; i++)
{
    var row = dt.NewRow();
    row[0] = i;
    dt.Rows.Add(row);
}

foreach(DataRow row in dt.Rows)
    row.Dump();
于 2012-08-17T01:38:53.093 に答える
0

データテーブルに行を追加するには、newTable.Rows.Add(array);を使用します。他のテーブルから別のテーブルに行を追加するには、newTable.ImportRow(row);を使用します。

例 :

        DataTable dt = GetTable(true);

        dataGridView1.DataSource = dt;


        DataRow row = dt.NewRow();
        row[0] = 101;
        row[1] = "101";
        row[2] = "101";
        row[3] = DateTime.Now;


        dt.ImportRow(row);

        DataTable dt2 = GetTable(false);

        object[] r = { 105, "Habib", "Zare", DateTime.Now };
        dt2.Rows.Add(r);

        dt2.ImportRow(dt.Rows[1]);
        dataGridView2.DataSource = dt2;

GetTable メソッド:

    static DataTable GetTable(bool isAddRows)
    {

        DataTable table = new DataTable();
        table.Columns.Add("Dosage", typeof(int));
        table.Columns.Add("Drug", typeof(string));
        table.Columns.Add("Patient", typeof(string));
        table.Columns.Add("Date", typeof(DateTime));


        if (isAddRows)
        {
            table.Rows.Add(25, "Indocin", "David", DateTime.Now);
            table.Rows.Add(50, "Enebrel", "Sam", DateTime.Now);
            table.Rows.Add(10, "Hydralazine", "Christoff", DateTime.Now);
            table.Rows.Add(21, "Combivent", "Janet", DateTime.Now);
            table.Rows.Add(100, "Dilantin", "Melanie", DateTime.Now);
        }

        return table;
    }
于 2012-08-17T01:56:30.613 に答える