2

Windowsフォームを使用すると、2つのリンクラベルが動的に作成されます。ユーザーがリンクラベルのいずれかをクリックすると、1つの動的フォームが作成されます。そのフォームで、1つのデータグリッド、テキストボックス、および動的に配置されたボタン(その動的フォーム)を作成しました。次に、動的ボタンクリックイベントで動的データグリッドにアクセスします。どうやってやるの?

private void Users_Load(object sender, EventArgs e)
{
    da = new SqlDataAdapter("Usp_Get_Employees", con);
    ds = new DataSet();
    da.Fill(ds);

    if (ds.Tables[0].Rows.Count > 0)
    {
        for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
        {
            string somecode = i.ToString() + ds.Tables[0].Rows[i]["eid"].ToString();
            LinkLabel  lbluser  = new LinkLabel();
            lbluser.Name =  ds.Tables[0].Rows[i]["eid"].ToString();
            lbluser.Text = ds.Tables[0].Rows[i]["ename"].ToString();
            lbluser.Location = new System.Drawing.Point(40, i * 40);
            lbluser.Size = new System.Drawing.Size(50, 30);
            Controls.Add(lbluser);
            lbluser.Click += new EventHandler(lbluser_Click);
        }
    }
}


void lbluser_Click(object sender, EventArgs e)
{
    LinkLabel lnkClis = (LinkLabel)sender;
    Form frm = new Form();
    frm.Name = lnkClis.Name;
    frm.Text = lnkClis.Text;
    frm.Show();

    DataGrid dtgrd = new DataGrid();
    dtgrd.Location = new System.Drawing.Point(10, 1 * 40);
    dtgrd.Name = lnkClis.Name;
    names = lnkClis.Name;

    TextBox tx = new TextBox();

    tx.Location = new System.Drawing.Point(10, 5 * 40);
    tx.Size = new Size(80, 30);
    tx.Multiline = true;
    tx.LostFocus += new EventHandler(tx_LostFocus);

    Button btn = new Button();
    btn.Location = new System.Drawing.Point(10, 7 * 40);
    btn.Size = new System.Drawing.Size(50, 30);
    btn.Name = lnkClis.Name;
    btn.Click += new EventHandler(btn_Click);

    frm.Controls.Add(dtgrd);
    frm.Controls.Add(tx);
    frm.Controls.Add(btn);
}

// Now I am trying to access the data grid in the btn_click event

void btn_Click(object sender, EventArgs e)
{
    Button btsave = (Button)sender;
    string eid = btsave.Name;

    object grd = btsave.Parent.Controls.Find("dtgrd", true).FirstOrDefault();

    ((DataGrid)grd).DataSource = ds.Tables[0];
}

今、私は次の場所でオブジェクトのインスタンスのエラーオブジェクトセットを取得しています:

((DataGrid)grd).DataSource = ds.Tables[0];
4

4 に答える 4

2

あなたが書いた例外メッセージ:

今、私はオブジェクトのインスタンスのエラーオブジェクトセットを取得しています

意味がありませんが、

オブジェクト参照がオブジェクト インスタンスに設定されていません

Findこの場合、エラーはメソッド呼び出しにあると思います。ドキュメントによると:

Nameプロパティでコントロールを検索し、一致するすべてのコントロールの配列を作成します。

ボタンクリックハンドラーでは、グリッドはdtgrdと呼ばれると想定していますが、グリッドを作成するときは、次のように名前を付けます。

dtgrd.Name = lnkClis.Name;

この行を次のように変更すれば十分です。

dtgrd.Name = "dtgrd";

そうは言っても、ボタンクリックハンドラーには匿名の方法を使用することを検討する必要があります。Findそもそもメソッドを呼び出す必要がなくなります。

 void lbluser_Click(object sender, EventArgs e)
{
   //...
    DataGrid dtgrd = new DataGrid();
   //...
    Button btn = new Button();
   //...
    btn.Click += (sender,args)=> dtgrd.DataSource = ds.Tables[0];
于 2012-09-10T09:51:58.360 に答える
1

次のコードを試してください

    public Form1()
    {
        Form f1 = new Form();

        f1.Text = "New Form";

        TextBox t1 = new TextBox();
        t1.Top = 0;
        t1.Name = "t1";
        t1.Visible = true;
        f1.Controls.Add(t1);

        Button b1 = new Button();
        b1.Top = 30;
        b1.Name = "b1";
        b1.Text = "Click";
        b1.Click += b1_Click;
        f1.Controls.Add(b1);

        f1.Show();
    }

    public void b1_Click(object sender, EventArgs e)
    {
        Button btn = (Button)sender;
        object txt = btn.Parent.Controls.Find("t1", false).First();
        ((TextBox)txt).Text = "Hi, you have clicked me.";
    }
于 2012-09-07T09:51:27.673 に答える
1

Niteshのコードを少し変更しました。ラムダを使用してクリックハンドラーでテキストボックスをキャプチャするだけです。

public Form1()
{
    Form f1 = new Form();

    f1.Text = "New Form";

    TextBox t1 = new TextBox();
    t1.Top = 0;
    t1.Name = "t1";
    t1.Visible = true;
    f1.Controls.Add(t1);

    Button b1 = new Button();
    b1.Top = 30;
    b1.Name = "b1";
    b1.Text = "Click";
    b1.Click += (sender, args) => MessageBox.Show("The text is: " + t1.Text);
    f1.Controls.Add(b1);

    f1.Show();
}
于 2012-09-07T09:55:08.610 に答える
0

取得しているエラーは、ステートメントからのものです(grdオブジェクトはnull):

((DataGrid)grd).DataSource = ds.Tables[0];

動的制御を把握しようとしているので、適切なnullチェック、型チェック、およびエラー処理を行うことをお勧めします。このようなもの:

if(grd != null && grd is DataGrid)
    ((DataGrid)grd).DataSource = ds.Tables[0];
于 2012-09-17T05:48:44.643 に答える