1

我已将我的 ListView 绑定到数据库。我已经使用 SqlDataSource 来完成这项工作。我想以编程方式更改数据源,但这就是一切都出错的地方。我尝试通过这样做来获取当前数据源:

SqlDataSource oldSource = lstContacts.DataSource as SqlDataSource;

然后我想将 SqlDataSource 的 SelectCommand 保存在一个字符串中:

string oldSelectCommand = oldSource.SelectCommand;

我这样做是因为我想检查 select 语句是否包含 order by 子句,如果包含,则将其取走并用另一个 order by 子句进行更改:)

但是,我得到了这个:

"System.NullReferenceException: Object reference not set to an instance of an object."

任何人?请 (:

4

1 回答 1

1

当您在标记中设置 ListView 的 DataSourceID 时,会发生这种情况,如下所示:

<asp:ListView ID="ListView1" runat="server" 
    DataKeyNames="AccountID" DataSourceID="SqlDataSource1" >

The property DataSource is null if the binding comes by the DataSourceID property.

如果您在代码中对 ListView 进行数据绑定,则可以访问它们,直到有任何回发。ListView 数据源未存储在视图状态中,因此在您设置数据源并再次重新绑定 ListView 之前它会丢失。

解决方法: 在给定的场景中,我将使用隐藏字段来存储 Order By 子句,并在代码中设置 ListView 的数据源:

<asp:HiddenField ID="hdnOrderBy" runat="server" />
    <asp:ListView ID="ListView1" runat="server" DataKeyNames="AccountID">
        ... ... ...

在代码中:

private void BindListView()
{
    string orderBy = hdnOrderBy.Value;
    //Your conditions here
    if (orderBy.Contains("By AccountID"))
    {
        orderBy = " Order By CompanyName";
        hdnOrderBy.Value = orderBy;
    }

    string selectCommand = "SELECT [AccountID], [CompanyName], [CompanyID]  FROM [Account] ";
    SqlDataSource1.SelectCommand = String.Format("{0} {1}",selectCommand,orderBy);
    ListView1.DataSource = SqlDataSource1;
    ListView1.DataBind();
}

希望能帮助到你!

于 2013-09-02T19:40:30.370 回答