移动端滑动含图片的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提前回收,单元格复用时访问已释放的流导致异常。
修复方案
- 无图片时直接将
ImageSource设为null,避免无效流的创建。 - 有图片时,将
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
相关产品推荐
相关产品推荐

