You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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#时碰到两个问题:

  1. 照搬VB写法时,直接报错:Non-invocable member 'Control.controls' cannot be used like a method.
  2. 调整语法后无报错,但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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 17:23:19