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

DevExpress ItemsView.QueryItemTemplate无限循环问题求助

DevExpress ChatDemo 无限循环问题解决思路

问题现象

在实现ChatDemo的消息模板自定义时,使用ItemsView.QueryItemTemplate事件为不同用户的消息加载不同HTML模板,代码陷入无限循环,即使注释OnCustomizeItem事件仍无法解决。

问题根源

对比Demo代码与你的实现,核心差异在于模板赋值的对象:

  • Demo中是给**当前行的e.Template**应用样式(Styles.MyMessage.Apply(e.Template)),仅修改当前项的模板配置,不会触发整个View的重新渲染。
  • 你的代码直接修改整个ItemsView的HtmlTemplate.Template和Styles,这会触发View的重新渲染逻辑,进而再次触发QueryItemTemplate事件,形成无限循环。

解决步骤

  1. 提前加载模板资源:在窗体初始化时读取HTML和CSS文件内容,避免每次事件触发都重复IO操作,提升性能。
  2. 修改当前项的模板:在QueryItemTemplate事件中,为当前行的e.Template赋值,而非修改整个View的全局模板。

修改后的代码示例

' 提前在窗体级别定义变量存储模板内容
Private ownMessageHtml As String
Private ownMessageCss As String
Private messageHtml As String
Private messageCss As String

' 窗体初始化时加载模板
Private Sub FrmChat_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    ' 替换为你的实际文件路径
    ownMessageHtml = File.ReadAllText("C:\Users\Admin\Documents\Visual Studio 2022\Projects\SDSoftdent\SDControls\FrmChat\Resources\Html\OwnMessage.html")
    ownMessageCss = File.ReadAllText("C:\Users\Admin\Documents\Visual Studio 2022\Projects\SDSoftdent\SDControls\FrmChat\Resources\Css\OwnMessage.css")
    messageHtml = File.ReadAllText("C:\Users\Admin\Documents\Visual Studio 2022\Projects\SDSoftdent\SDControls\FrmChat\Resources\Html\Message.html")
    messageCss = File.ReadAllText("C:\Users\Admin\Documents\Visual Studio 2022\Projects\SDSoftdent\SDControls\FrmChat\Resources\Css\Message.css")
End Sub

Private Sub IvMessages_QueryItemTemplate(sender As Object, e As DevExpress.XtraGrid.Views.Items.QueryItemTemplateEventArgs) Handles IvMessages.QueryItemTemplate
    Dim message = TryCast(e.Row, MessageTest)
    If message Is Nothing Then Return

    If message.UserName = "Angelo" Then
        e.Template.Assign(IvMessages.HtmlTemplate)
        e.Template.Template = ownMessageHtml
        e.Template.Styles = ownMessageCss
    Else
        e.Template.Assign(IvMessages.HtmlTemplate)
        e.Template.Template = messageHtml
        e.Template.Styles = messageCss
    End If
End Sub

关键说明

  • e.Template.Assign(IvMessages.HtmlTemplate):先复制全局模板的基础配置,再覆盖当前项的HTML和CSS,确保模板继承全局的其他设置。
  • 提前加载模板文件:避免事件触发时重复读取文件,减少IO开销,同时避免因文件读取可能引发的其他问题。

内容的提问来源于stack exchange,提问作者zohan3456

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 00:07:04