作为客户的要求,我将我用C#构建的Web应用程序迁移到Visual Basic中,并且在尝试使用数据绑定器对数据主导进行数据绑定时遇到了一些问题。 DataTable作为源。
在我的原始代码中,在C#中,DataList Databinding工作得很好,但在Visual Basic中会抛出Null Reference Exception。我已经完成了一步一步的调试,所有使用过的变量都被初始化并有数据,所以我想知道C#和Visual Basic之间的绑定过程是否存在差异。
这是我原来的C#代码
public void CargarMiniaturas(Imagen iImagen) {
//I clear the DataList DataSource
dlMiniaturas.DataSource = null;
// Number of pages
int CantPaginas = iImagen.CantidadPaginas;
//Create DataTable and DataColumn
DataTable dt = new DataTable( );
DataColumn dc = new DataColumn("Imagen", typeof(System.String));
dt.Columns.Add(dc);
//Fill the data
for(int i = 0; i <= CantPaginas - 1; i++) {
DataRow dr = dt.NewRow( );
dr[0] = "data:image/gif;base64," + Globales.Imagen_a_Base64(iImagen.GetThumbnail(iImagen, i, new Size(120, 120)));
dt.Rows.Add(dr);
}
//Load the data into the DataList
dlMiniaturas.DataSource = dt;
dlMiniaturas.DataBind( );
dlMiniaturas.SelectedIndex = _iImagen.iNumPagina;
}
我的Visual Basic代码:
Public Sub CargarMiniaturas(iImagen As Imagen)
'I clear the DataList DataSource
dlMiniaturas.DataSource = Nothing
'Number of pages
Dim CantPaginas As Integer = iImagen.CantidadPaginas
'Create Datatable and Datacolumn
Dim dt As New DataTable()
Dim dc As New DataColumn("Imagen", GetType(System.String))
dt.Columns.Add(dc)
'Fill the data
For i As Integer = 0 To CantPaginas - 1
Dim dr As DataRow = dt.NewRow()
dr(0) = "data:image/gif;base64," + Globales.Imagen_a_Base64(iImagen.GetThumbnail(iImagen, i, New Size(120, 120)))
dt.Rows.Add(dr)
Next
'Load the data into the datalist
dlMiniaturas.DataSource = dt
dlMiniaturas.DataBind() ' Here is where throws the nullreference exception.
dlMiniaturas.SelectedIndex = _iImagen.iNumPagina
End Sub
在这两种情况下,参数 iImagen 都包含我使用的自定义对象及其所有属性和值。此外,此函数中使用的所有变量都具有相应的值。
基本上,我尝试做的是使用一些自定义对象将Multi Page Tiff图像缩略图预览加载到DataList中,这些对象完美地适用于C#项目。
我做错了什么?
一些背景知识:
我的原始解决方案包括几个项目,其中我在库中隔离了自定义Image对象(ImageViewer.Lib.dll)所需的所有代码以及其他单独的组件,以在Windows窗体,WebForms中可视化图像和Windows Presentation Foundation。
构建Visual Basic项目Web可视化我已经使用了我用C#编写的ImageViewer.Lib.dll的引用,因此除了Web查看器之外不需要重建任何东西
我是Visual Basic新手,所以我使用了在线代码转换器。到目前为止,除此之外一切都很好。
您可以提供的任何帮助或提示都很有用。
答案 0 :(得分:0)
这是我的错! 我正在使用ItemDataBound事件,其中包含:
Protected Sub dlMiniaturas_ItemDataBound(sender As Object, e As DataListItemEventArgs)
If e.Item.ItemType = ListItemType.Item OrElse e.Item.ItemType = ListItemType.AlternatingItem OrElse e.Item.ItemType = ListItemType.SelectedItem Then
Dim dli As ImageButton = DirectCast(e.Item.FindControl("imbBtn"), ImageButton)
dli.Attributes.Add("ident", "btnMiniatura")
dli.Attributes.Add("index", e.Item.ItemIndex.ToString())
End If
End Sub
但是在aspx中我用控件注释掉了这一行&#34; imbBtn&#34;。
<asp:DataList ID="dlMiniaturas" CssClass="Tabla" runat="server" OnItemDataBound="dlMiniaturas_ItemDataBound" EnableViewState="False" CellPadding="4" ForeColor="#333333">
<ItemTemplate>
<%--<asp:ImageButton runat="server" ID="imbBtn" ImageUrl='<%# Eval("Imagen") %>' Width="100" Height="100" CommandArgument='<%# Container.ItemIndex %>' EnableViewState="false" BackColor="White" ImageAlign="Middle" />--%>
</ItemTemplate>
</asp:DataList>
所以这是我的错误。 取消注释该线解决了这个问题。
无论如何,感谢所有花时间阅读的人。