0

DataGridView とラジオ ボタンのグループを動的に構築する非常に奇妙な問題に遭遇しました。Panel 内にラジオ ボタンのグループと DataGridView があります。私が直面している問題は、いくつかのラジオ ボタンのイベント ハンドラーを使用して、DataGridView の行数を取得しようとしていることです。私が使用している DataTable には 3 つの行があります。DGV に手動で行を追加することでこの問題を再現できますが、それは問題ではありません。DataGridView を初期化した後に rows.count を呼び出すと、計画どおりに動作して 3 が返されますが、EventHandler が起動されると返される行数は 0 です。私のコードは次のとおりです。

    private DataSet testData;
    private DataTable testDataTable;

    public Form1(API _api)
    {
        InitializeComponent();
        api = _api;
        businessLayer = new BusinessLayer();

        testData = api.getDataSet();
        testDataTable = businessLayer.getDataTable(testData);

        buildDataGridView();

    }

    // Build the DataGridView
    private void buildDataGridView()
    {
        int numOfRows = testDataTable.Rows.Count;

        DataGridView testDataGridView = new DataGridView();
        testDataGridView.Columns.Add("Description", "");
        testDataGridView.Columns.Add("Name", "");
        testDataGridView.Rows.Add(numOfRows);
        testDataGridView.Location = new Point(150, 20);

        for (int i = 0; i < numOfRows; i++)
        {
            RadioButton rbutton = new RadioButton();
            rbutton.Name = testDataTable.Rows[i].Field<string>("Name").ToString() + "RadioButton";
            rbutton.Text = testDataTable.Rows[i].Field<string>("Name");
            rbutton.Tag = testDataTable.Rows[i].Field<string>("SortOrder");
            rbutton.CheckedChanged += rbutton_CheckedChanged;
            if (i == 0)
            {
                rbutton.Checked = true;
            }
            rbutton.Location = new Point(5, 20 * (i + 1));
            testPanel.Controls.Add(definition);
        }

        testPanel.Controls.Add(testDataGridView);

        textBox1.Text = testDataGridView.Rows.Count.ToString();
    }

    // RadioButton CheckChanged EventHandler
    private void definition_CheckedChanged(object sender, EventArgs e)
    {
        RadioButton rb = (RadioButton)sender;
        if(rb.Checked)
        {
            textBox1.Text = testDataGridView.Rows.Count.ToString();

        }
    }

これは本当に私を混乱させましたが、私がそれを理解するなら、私はここで何かを学ぶに違いありません. これが DGV とラジオ ボタンがパネル内にあるという事実と関係があるかどうかはわかりません。わかりません...これについて助けてくれて、私が学ぶのを手伝ってくれてありがとう!

4

1 に答える 1

0

Grant Winney がコメントで説明したように、buildDataGridView() で参照される DataGridView と definition_CheckedChanged() で参照されるものは同じではありません...メモリ ヒープとメモリ スタックの例です。これは私がやろうとしていたことのより簡単な例です:

public partial class TestingForm2 : Form
{
    private DataTable testDataTable;
    // Must Declare here so the value is stored in heap memory
    // so other functions can access and use the value
    private DataGridView testDataGridView;

    public TestingForm2()
    {
        InitializeComponent();

        buildDataTable();
        buildDataGridView();
        buildRadioButtons();
    }

    private void buildRadioButtons()
    {
        int numOfRadioButtons = testDataTable.Rows.Count;

        for(int i = 0; i < numOfRadioButtons; i++)
        {
            RadioButton rb = new RadioButton();
            rb.Name = testDataTable.Rows[i].Field<string>("Name") + "RadioButton";
            rb.Text = testDataTable.Rows[i].Field<string>("Name");
            rb.Tag = testDataTable.Rows[i].Field<string>("Number");

            if(i == 0)
            {
                rb.Checked = true;
            }

            rb.Location = new Point(5, 20 * (i + 1));
            rb.CheckedChanged += rb_CheckedChanged;
            panel1.Controls.Add(rb);
        }

    }

    private void buildDataGridView()
    {
        // Get number of rows in testDataTable
        int numOfRows = testDataTable.Rows.Count;

        // Build the empty DGV
        // If I were to declare the DGV here the value given would have
        // been stored in the memory stack and could only be accessed by
        // this function.  This is where I went wrong and made a silly mistake
        testDataGridView = new DataGridView();
        testDataGridView.Columns.Add("Name", "");
        testDataGridView.Columns.Add("Number", "");
        testDataGridView.Rows.Add(numOfRows);
        testDataGridView.Location = new Point(150, 20);
        testDataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
        testDataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
        testDataGridView.AlternatingRowsDefaultCellStyle.BackColor = Color.LightGray;
        testDataGridView.AllowUserToAddRows = false;
        testDataGridView.AllowUserToDeleteRows = false;
        testDataGridView.MultiSelect = false;
        testDataGridView.ColumnHeadersVisible = false;
        testDataGridView.RowHeadersVisible = false;

        panel1.Controls.Add(testDataGridView);
    }

    private void buildDataTable()
    {
        testDataTable = new DataTable();

        // Add the Columns
        testDataTable.Columns.Add("Name");
        testDataTable.Columns.Add("Number");

        // Create and add the rows
        for (int i = 0; i < 3; i++)
        {
            // Create the new row
            DataRow dr;
            object[] rowItems = new object[testDataTable.Columns.Count];

            if (i == 0)
            {
                rowItems[0] = "Bob";
                rowItems[1] = "1";
            }
            else if (i == 1)
            {
                rowItems[0] = "John";
                rowItems[1] = "2";
            }
            else
            {
                rowItems[0] = "George";
                rowItems[1] = "3";
            }

            // Add the row
            dr = testDataTable.NewRow();
            dr.ItemArray = rowItems;
            testDataTable.Rows.Add(dr);
        }
    }

    private void TestingForm2_Load(object sender, EventArgs e)
    {
        textBox1.Text = testDataGridView.Rows.Count.ToString();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        textBox1.Text = testDataGridView.Rows.Count.ToString();
    }

    private void rb_CheckedChanged(object sender, EventArgs e)
    {
        RadioButton rb = (RadioButton)sender;
        int index = int.Parse(rb.Tag.ToString()) - 1;
        if (rb.Checked)
        {
            testDataGridView.Rows[index].Selected = true;
        }

    }
}

みんな間違えてごめん!助けてくれてありがとう!

于 2014-07-08T15:50:20.870 に答える