MessageBox.Show("datagridview成功!"); 你这也算找到控件?? 要DataGridView data = a as DataGridView; 判断 data是否等于null的,不等于null,说明找到了。 另完全看不懂你遍历label中的if语句有什么意义。
不,它只是赋值了,并没有判断lab1是否等于null,所以这段代码没意义。
你这段代码找到Label也会报失败的。
虽然没看懂你的意图,本着得分的心态 foreach (Panel pan in panel2.Controls) {
if (pan.Name == "pan" + i.ToString()) { //遍历datagridview foreach (Control a in pan.Controls) { if (a.Name.Trim() == "data" + i.ToString()) { DataGridView data = a as DataGridView; MessageBox.Show("datagridview成功!"); } else if (b.Name.Trim().ToLower() == "lab" + i.ToString()) { //遍历label Label lab1 = b as Label; MessageBox.Show("Label失败!") } } }
if (pan.Name == "pan" + i.ToString()) { //遍历datagridview foreach (Control a in pan.Controls) { if (a.Name.Trim() == "data" + i.ToString()) { DataGridView data = a as DataGridView; MessageBox.Show("datagridview成功!"); } else if (a.Name.Trim().ToLower() == "lab" + i.ToString()) { //遍历label Label lab1 = b as Label; MessageBox.Show("Label失败!") } }
private void YouMethod(Control container) { ....foreach (Panel pan in panel2.Controls) {
if (pan.Name == "pan" + i.ToString()) { //遍历datagridview foreach (Control a in pan.Controls) { if (a.Name.Trim() == "data" + i.ToString()) { DataGridView data = a as DataGridView; MessageBox.Show("datagridview成功!"); } else if (a.Name.Trim().ToLower() == "lab" + i.ToString()) { //遍历label Label lab1 = b as Label; MessageBox.Show("Label失败!") }//递归 if (a.HasChildren) YouMethod(a); }
} .... }
增加了递归遍历
第一次调用的时候 YouMethod(panel2);private void YouMethod(Control container) { ....foreach (Panel pan in container.Controls) {
if (pan.Name == "pan" + i.ToString()) { //遍历datagridview foreach (Control a in pan.Controls) { if (a.Name.Trim() == "data" + i.ToString()) { DataGridView data = a as DataGridView; MessageBox.Show("datagridview成功!"); } else if (a.Name.Trim().ToLower() == "lab" + i.ToString()) { //遍历label Label lab1 = b as Label; MessageBox.Show("Label失败!") }//递归 if (a.HasChildren) YouMethod(a); }
} .... }
//遍历datagridview foreach (Control a in pan.Controls) {//遍历label foreach (Control b in pan.Controls) 你这注释不靠谱吖这明明遍历的东西一样所有pan.Controls
foreach (Panel pan in panel2.Controls) {
if (pan.Name == "pan" + i.ToString()) { //遍历datagridview foreach (Control a in pan.Controls) { if (a.Name == "data" + i.ToString()) { DataGridView data = a as DataGridView; MessageBox.Show("datagridview成功!"); }
//遍历label
if (a.Name == "lab" + i.ToString()) { Label lab1 = a as Label; MessageBox.Show("Label失败!") } } }把二个if 放在一起。应该就可以了。 可以试一下 。 在用typeof() 判断一下类型
label装在某个容器,而不是直接在窗体中,需要递归遍历下。
foreach (Control b in pan.Controls) { if (b.Name == "lab" + i.ToString()) { Label lab1 = b as Label; MessageBox.Show("Label失败!") } }注意这行。 MessageBox.Show("Label失败!") 你找到了。 是提示的失败。
你这样遍历不行哦~~~就拿这段而言 foreach (Control a in pan.Controls) { if (a.Name == "data" + i.ToString()) { DataGridView data = a as DataGridView; MessageBox.Show("datagridview成功!"); } } 万一a的Name是data+i.ToString(),但它不是DataridView控件呢??我给你个webform的吧 System.Web.UI.WebControls.TextBox txt; System.Web.UI.WebControls.DropDownList ddl; foreach (Control MainControl in this.Page.Controls) { foreach (Control objControl in MainControl.Controls) { if (objControl.GetType().ToString() == "System.Web.UI.WebControls.TextBox") { txt = (System.Web.UI.WebControls.TextBox)objControl; if (txt.ClientID != "txtWorker_No" && txt.ClientID != "txtChecker_No" && txt.ClientID != "txtWork_Dt" && txt.ClientID != "txtTemp" && txt.ClientID != "txtChecker_Nm" && txt.ClientID != "txt_SureNm" && txt.ClientID != "txtSign_Nm" && txt.ClientID != "txtWorker_Nm") { txt.Text = ""; } } if (objControl.GetType().ToString() == "System.Web.UI.WebControls.DropDownList") { ddl = (System.Web.UI.WebControls.DropDownList)objControl; if (ddl.ClientID != "ddl_Shift" && ddl.ClientID != "ddlPlant_Site_Cd") { ddl.SelectedIndex = -1; } } } } this.txtS_No.Focus();
我觉得是Label lab1 = b as Label;这个有问题
要DataGridView data = a as DataGridView; 判断 data是否等于null的,不等于null,说明找到了。
另完全看不懂你遍历label中的if语句有什么意义。
foreach (Panel pan in panel2.Controls)
{
if (pan.Name == "pan" + i.ToString())
{
//遍历datagridview
foreach (Control a in pan.Controls)
{
if (a.Name.Trim() == "data" + i.ToString())
{
DataGridView data = a as DataGridView;
MessageBox.Show("datagridview成功!");
}
else if (b.Name.Trim().ToLower() == "lab" + i.ToString())
{
//遍历label
Label lab1 = b as Label;
MessageBox.Show("Label失败!")
}
} }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
foreach (Panel pan in panel2.Controls)
{
if (pan.Name == "pan" + i.ToString())
{
//遍历datagridview
foreach (Control a in pan.Controls)
{
if (a.Name.Trim() == "data" + i.ToString())
{
DataGridView data = a as DataGridView;
MessageBox.Show("datagridview成功!");
}
else if (a.Name.Trim().ToLower() == "lab" + i.ToString())
{
//遍历label
Label lab1 = b as Label;
MessageBox.Show("Label失败!")
}
}
}
如果是这样,那么foreach pan的子控件,当然是找不到Label了。
上面代码做的改掉,主要是忽略标签名大小写的问题
{
....foreach (Panel pan in panel2.Controls)
{
if (pan.Name == "pan" + i.ToString())
{
//遍历datagridview
foreach (Control a in pan.Controls)
{
if (a.Name.Trim() == "data" + i.ToString())
{
DataGridView data = a as DataGridView;
MessageBox.Show("datagridview成功!");
}
else if (a.Name.Trim().ToLower() == "lab" + i.ToString())
{
//遍历label
Label lab1 = b as Label;
MessageBox.Show("Label失败!")
}//递归
if (a.HasChildren)
YouMethod(a);
}
}
....
}
增加了递归遍历
YouMethod(panel2);private void YouMethod(Control container)
{
....foreach (Panel pan in container.Controls)
{
if (pan.Name == "pan" + i.ToString())
{
//遍历datagridview
foreach (Control a in pan.Controls)
{
if (a.Name.Trim() == "data" + i.ToString())
{
DataGridView data = a as DataGridView;
MessageBox.Show("datagridview成功!");
}
else if (a.Name.Trim().ToLower() == "lab" + i.ToString())
{
//遍历label
Label lab1 = b as Label;
MessageBox.Show("Label失败!")
}//递归
if (a.HasChildren)
YouMethod(a);
}
}
....
}
foreach (Control a in pan.Controls) {//遍历label
foreach (Control b in pan.Controls)
你这注释不靠谱吖这明明遍历的东西一样所有pan.Controls
{
if (pan.Name == "pan" + i.ToString())
{
//遍历datagridview
foreach (Control a in pan.Controls)
{
if (a.Name == "data" + i.ToString())
{
DataGridView data = a as DataGridView;
MessageBox.Show("datagridview成功!");
}
//遍历label
if (a.Name == "lab" + i.ToString())
{
Label lab1 = a as Label;
MessageBox.Show("Label失败!")
}
}
}把二个if 放在一起。应该就可以了。 可以试一下 。 在用typeof() 判断一下类型
{
if (b.Name == "lab" + i.ToString())
{
Label lab1 = b as Label;
MessageBox.Show("Label失败!")
}
}注意这行。 MessageBox.Show("Label失败!")
你找到了。 是提示的失败。
foreach (Control a in pan.Controls)
{
if (a.Name == "data" + i.ToString())
{
DataGridView data = a as DataGridView;
MessageBox.Show("datagridview成功!");
}
}
万一a的Name是data+i.ToString(),但它不是DataridView控件呢??我给你个webform的吧 System.Web.UI.WebControls.TextBox txt;
System.Web.UI.WebControls.DropDownList ddl;
foreach (Control MainControl in this.Page.Controls)
{
foreach (Control objControl in MainControl.Controls)
{
if (objControl.GetType().ToString() == "System.Web.UI.WebControls.TextBox")
{
txt = (System.Web.UI.WebControls.TextBox)objControl;
if (txt.ClientID != "txtWorker_No" && txt.ClientID != "txtChecker_No" && txt.ClientID != "txtWork_Dt" && txt.ClientID != "txtTemp" && txt.ClientID != "txtChecker_Nm"
&& txt.ClientID != "txt_SureNm" && txt.ClientID != "txtSign_Nm" && txt.ClientID != "txtWorker_Nm")
{
txt.Text = "";
}
}
if (objControl.GetType().ToString() == "System.Web.UI.WebControls.DropDownList")
{
ddl = (System.Web.UI.WebControls.DropDownList)objControl;
if (ddl.ClientID != "ddl_Shift" && ddl.ClientID != "ddlPlant_Site_Cd")
{
ddl.SelectedIndex = -1;
}
}
}
}
this.txtS_No.Focus();