gpt4 book ai didi

winforms - 在 Windows 窗体 C# .NET 中查找控件?

转载 作者:行者123 更新时间:2023-12-04 18:12:33 29 4
gpt4 key购买 nike

使用 Windows 窗体,动态创建两个链接标签。当用户点击任何一个链接标签时,就会创建一个动态表单。在该表单中,我创建了一个数据网格、一个文本框和一个动态放置的按钮(在该动态表单中)。现在我想在动态按钮单击事件中访问动态数据网格。我怎样才能做到这一点?

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];

最佳答案

您编写的异常消息:

Now I am getting an error object set of instances of an object at



没有意义,但它看起来像

Object reference not set to an instance of an object



如果是这种情况,我认为错误在于 Find方法调用。根据 documentation :

Searches for controls by their Name property and builds an array of all the controls that match.



在您的按钮单击处理程序中,您假设网格被称为 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];

关于winforms - 在 Windows 窗体 C# .NET 中查找控件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12315473/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com