如何在C#中访问DataRepeater内部控件?遇调用错误及事件未触发
C#中DataRepeater控件的问题修复指南
问题背景
原VB代码实现逻辑:当DataRepeaterItem内指定控件的文本转为布尔值为True时,修改另一个控件的显示文本、背景色和前景色;否则重置该控件的颜色。
原VB代码:
If CBool(e.DataRepeaterItem.Controls(Temp_S.Name).Text) = True Then e.DataRepeaterItem.Controls(T_S.Name).Text = "S" e.DataRepeaterItem.Controls(T_S.Name).BackColor = Color.Yellow e.DataRepeaterItem.Controls(T_S.Name).ForeColor = Color.Black Else e.DataRepeaterItem.Controls(T_S.Name).BackColor = Color.White e.DataRepeaterItem.Controls(T_S.Name).ForeColor = Color.White End If
转成C#时碰到两个问题:
- 照搬VB写法时,直接报错:
Non-invocable member 'Control.controls' cannot be used like a method. - 调整语法后无报错,但
DrawItem事件完全不触发,断点打了也没用,功能根本跑不起来。调整后的C#代码如下:
private void DataRepeater_Buoni_DrawItem(object sender, Microsoft.VisualBasic.PowerPacks.DataRepeaterItemEventArgs e) { // Accende S if (Convert.ToBoolean(e.DataRepeaterItem.Controls["t_Buono.Name"].Text = "10268")) { e.DataRepeaterItem.Controls["t_S.Name"].Text = "S"; e.DataRepeaterItem.Controls["t_S.Name"].BackColor = Color.Yellow; e.DataRepeaterItem.Controls["t_S.Name"].ForeColor = Color.Black; } else { e.DataRepeaterItem.Controls[t_S.Name].BackColor = Color.White; e.DataRepeaterItem.Controls[t_S.Name].ForeColor = Color.White; } }
问题修复步骤
1. 解决Controls调用的语法错误
VB里用圆括号()调用索引器,C#里必须用方括号[]。原VB代码的e.DataRepeaterItem.Controls(Temp_S.Name),在C#里要写成e.DataRepeaterItem.Controls[Temp_S.Name],这是第一个报错的根源。
2. 修复DrawItem事件不触发的问题
调整后的代码有好几个逻辑错误,同时要确认事件是否正确绑定:
- 条件判断写错了:
e.DataRepeaterItem.Controls["t_Buono.Name"].Text = "10268"用了赋值=而非比较==,这会直接把控件文本改成"10268",再转成布尔值(非空字符串都会转成True),逻辑完全走偏。 - 控件名称用错了:
"t_Buono.Name"是硬编码的字符串,不是获取t_Buono控件的Name属性值,应该直接用变量t_Buono.Name(别加引号)。 - 事件没绑定:打开DataRepeater控件的事件列表,确认
DrawItem事件已经关联到DataRepeater_Buoni_DrawItem方法。要么在设计器里双击DrawItem自动生成绑定,要么在代码里手动加:
// 放在窗体构造函数或者Load事件里 DataRepeater_Buoni.DrawItem += DataRepeater_Buoni_DrawItem;
修正后的完整C#代码
private void DataRepeater_Buoni_DrawItem(object sender, Microsoft.VisualBasic.PowerPacks.DataRepeaterItemEventArgs e) { // 获取Temp_S控件的文本并转成布尔值 bool isTempSTrue = Convert.ToBoolean(e.DataRepeaterItem.Controls[Temp_S.Name].Text); var tSControl = e.DataRepeaterItem.Controls[T_S.Name]; if (isTempSTrue) { tSControl.Text = "S"; tSControl.BackColor = Color.Yellow; tSControl.ForeColor = Color.Black; } else { tSControl.BackColor = Color.White; tSControl.ForeColor = Color.White; } }
如果控件是特定类型(比如Label),可以强制转换来提升类型安全性:
Label tempSLabel = (Label)e.DataRepeaterItem.Controls[Temp_S.Name]; bool isTempSTrue = Convert.ToBoolean(tempSLabel.Text);
内容的提问来源于stack exchange,提问作者Livio
相关产品推荐
相关产品推荐

