0

プログラムでデータグリッドを作成していますが、別のデータグリッドに追加するために、ユーザーから変更されたセルの値を取得したいと考えています。

私のコードはこれです:

connTo.Open();

SqlDataReader sqlFromReader1 = null;
SqlDataReader sqlFromReader2 = null;
SqlDataReader sqlFromReader3 = null;

SqlCommand myFromCommand1 = new SqlCommand("select distinct m.catid1, c.descr "+
"from material m "+
"inner join cat1 c on c.id = m.catid1", connTo);
sqlFromReader1 = myFromCommand1.ExecuteReader();

DataTable dt1 = new DataTable();
dt1.Load(sqlFromReader1);

for (i = 0; i < dt1.Rows.Count; i++)
{
    //int c1 = (int)(dt1.Rows[i]["catid1"]);
    TabPage tbg = new TabPage(dt1.Rows[i]["descr"].ToString());
    tabControl1.Controls.Add(tbg);

    TabControl tbi = new TabControl();
    tbi.Name = i.ToString() + i.ToString();

    SqlCommand myFromCommand2 = new SqlCommand(
        "select distinct m.catid2, c.descr " +
        "from material m " +
        "inner join cat2 c on c.id = m.catid2 "+
        "and m.catid1 = " + dt1.Rows[i]["catid1"].ToString(), connTo);
        sqlFromReader2 = myFromCommand2.ExecuteReader();

    DataTable dt2 = new DataTable();
    dt2.Load(sqlFromReader2);

    for (int k = 0; k < dt2.Rows.Count; k++)
    {
        //int c2 = (int)(dt2.Rows[k]["catid2"]);
        TabPage tbgi = new TabPage(dt2.Rows[k]["descr"].ToString());
        tbi.Controls.Add(tbgi);
        tbi.Left = 1;
        tbi.Top = 1;
        tbi.Width = 880;
        tbi.Height = 400;


        DataGridView gv = new DataGridView();

        gv.Width = 850;
        gv.Height = 340;            
        gv.Left = 10;
        gv.Top = 10;
        gv.ColumnCount = 4;
        gv.Columns[0].Name = "code";
        gv.Columns[0].Width = 120;
        gv.Columns[0].ReadOnly = true;

        gv.Columns[1].Name = "name";
        gv.Columns[1].Width = 450;
        gv.Columns[1].ReadOnly = true;

        gv.Columns[2].Name = "price";
        gv.Columns[2].Width = 80;
        gv.Columns[2].ReadOnly = true;

        gv.Columns[3].Name = "qty";
        gv.Columns[3].Width = 120;

        SqlCommand myFromCommand3 = new SqlCommand(
            "select m.code, m.descr, m.cost1 price " +
            "from material m " +
            "where m.catid1 = " + dt1.Rows[i]["catid1"].ToString() + " " +
            "and m.catid2 = " + dt2.Rows[k]["catid2"].ToString(), connTo);

        sqlFromReader3 = myFromCommand3.ExecuteReader();

        DataTable dt3 = new DataTable();
        dt3.Load(sqlFromReader3);

        for (int l = 0; l < dt3.Rows.Count; l++)
        {
            gv.Rows.Add(dt3.Rows[l]["code"].ToString(), dt3.Rows[l]["descr"].ToString(), dt3.Rows[l]["price"].ToString(), "");
        }

        tbgi.Controls.Add(gv);                       
    }
    tbg.Controls.Add(tbi);

ここで、ユーザーが gv.Columns[3].Name ("qty") の値を変更して、この値と残りの行データを新しいデータリストに追加したときにキャッチしたいと考えています。

これはどのように行うことができますか?これは可能ですか?

4

1 に答える 1

0

このCellValueChanged場合、イベントは機能するはずです。

新しいDataGridViewインスタンスをそれぞれ作成してタブに追加するときは、イベント ハンドラーを追加するだけです。

dataGridView1.CellValueChanged += new DataGridViewCellEventHandler(dataGridView1_CellValueChanged);

dataGridView1_CellValueChanged次に、すべてのイベント ハンドラーで使用されるメソッドを 1 か所に配置します。

変更された列インデックスと行インデックスの両方のプロパティを持つCellValueChangedイベント ハンドラーのシグネチャ。DataGridViewCellEventArgsしたがって、次のようなコードがあります。

void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
    if (e.ColumnIndex == 3)
    {
        // Now you can cast sender to a DataGridView and copy the row at e.RowIndex
        DataGridView dgv = sender as DataGridView;
        if (dgv == null)
            return;

        // Here you get the cell value
        var cellValue = dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString();
    }
}

dt3 をデータソースとして割り当てることもお勧めします。バインドされていないグリッドではなくデータソースを使用すると、行のコピーがよりクリーンになります。

于 2012-04-25T22:30:02.060 に答える