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事件,形成无限循环。
解决步骤
- 提前加载模板资源:在窗体初始化时读取HTML和CSS文件内容,避免每次事件触发都重复IO操作,提升性能。
- 修改当前项的模板:在
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
相关产品推荐
相关产品推荐

