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

移动端滑动含图片的SyncFusion SfDataGrid时触发System.ObjectDisposedException异常

移动端滑动SyncFusion SfDataGrid时抛出System.ObjectDisposedException异常

在移动端左右滑动包含图片列的SyncFusion SfDataGrid控件时,控件崩溃并抛出异常:

System.ObjectDisposedException: Cannot access a closed Stream

当前为DataGrid绑定ItemSource的代码中,当图片Base64字符串为空时,通过ImageSource.FromStream(() => null)分配空流,虽然初始显示正常,但滑动时触发了上述异常。

原绑定代码

FieldVisitReport obj = new();
obj.SlNo = FieldVisitItems.Count() + 1;
obj.AgentName = v.AgentName;
if (!string.IsNullOrEmpty(v.Image1))
{
    Stream s = new MemoryStream(Convert.FromBase64String(v.Image1));
    obj.Image1 = ImageSource.FromStream(() => s);
}
else
    obj.Image1 = ImageSource.FromStream(() => null);
if (!string.IsNullOrEmpty(v.Image2))
{
    Stream s = new MemoryStream(Convert.FromBase64String(v.Image2));
    obj.Image2 = ImageSource.FromStream(() => s);
}
else
    obj.Image2 = ImageSource.FromStream(() => null);

obj.ClientCategory = v.ClientCategory;
obj.ClientPartyName = v.ClientPartyName;
obj.ClientPhone = v.ClientPhone;
obj.TrackingStatus = v.TrackingStatus;
obj.Datetime = v.DateNTimeUTC.AddHours(5).AddMinutes(30).ToString("dd-MM-yyyy");

FieldVisitItems.Add(obj);

原XAML代码

<syncfusion:SfDataGrid.Columns>
    <syncfusion:DataGridTextColumn HeaderText="Sl No" MappingName="SlNo" MinimumWidth="30"/>
    <syncfusion:DataGridImageColumn HeaderText="Product Photo" Aspect="Fill"
                                    MappingName="Image1" MinimumWidth="150">
    </syncfusion:DataGridImageColumn>
    <syncfusion:DataGridImageColumn HeaderText="Competitor Photo" Aspect="Fill"
                                    MappingName="Image2" MinimumWidth="150">
    </syncfusion:DataGridImageColumn>
    <syncfusion:DataGridTextColumn HeaderText="Agent Name" MappingName="AgentName" MinimumWidth="150"/>
    <syncfusion:DataGridTextColumn HeaderText="Client Category" MappingName="ClientCategory" MinimumWidth="150"/>
    <syncfusion:DataGridTextColumn HeaderText="Client Name" MappingName="ClientPartyName" MinimumWidth="150"/>
    <syncfusion:DataGridTextColumn HeaderText="Client Phone" MappingName="ClientPhone" MinimumWidth="150"/>
    <syncfusion:DataGridTextColumn HeaderText="Date" MappingName="Datetime" MinimumWidth="150"/>
    <syncfusion:DataGridTextColumn HeaderText="Tracking Status" MappingName="TrackingStatus" MinimumWidth="150"/>
</syncfusion:SfDataGrid.Columns>

问题原因

  • 空图片场景:ImageSource.FromStream(() => null)会让DataGrid在复用单元格时尝试访问无效流,触发资源访问异常。
  • 有图片场景:原代码提前创建MemoryStream并传递给工厂方法,流可能被GC提前回收,单元格复用时访问已释放的流导致异常。

修复方案

  1. 无图片时直接将ImageSource设为null,避免无效流的创建。
  2. 有图片时,将MemoryStream的创建逻辑放在FromStream的工厂方法内部,确保每次渲染图片都生成新的流实例。

修改后的代码

FieldVisitReport obj = new();
obj.SlNo = FieldVisitItems.Count() + 1;
obj.AgentName = v.AgentName;

if (!string.IsNullOrEmpty(v.Image1))
{
    // 每次需要流时创建新实例,避免流被提前释放
    obj.Image1 = ImageSource.FromStream(() => new MemoryStream(Convert.FromBase64String(v.Image1)));
}
else
{
    // 无图片直接赋值null,DataGrid会自动处理空值
    obj.Image1 = null;
}

if (!string.IsNullOrEmpty(v.Image2))
{
    obj.Image2 = ImageSource.FromStream(() => new MemoryStream(Convert.FromBase64String(v.Image2)));
}
else
{
    obj.Image2 = null;
}

obj.ClientCategory = v.ClientCategory;
obj.ClientPartyName = v.ClientPartyName;
obj.ClientPhone = v.ClientPhone;
obj.TrackingStatus = v.TrackingStatus;
obj.Datetime = v.DateNTimeUTC.AddHours(5).AddMinutes(30).ToString("dd-MM-yyyy");

FieldVisitItems.Add(obj);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 19:15:34