Datalist.DataSource 问题

Datalist.DataSource issue

我有 1 个 DataList 和 2 个 SqlDataSource

我最初将 DataList1 设置为与 SqlDataSource1

配对

我有一个按钮可以将 DataSource 更改为 SqlDataSource2

DataList1.DataSource = SqlDataSource2;
DataList1.DataBind();

但是这样做会抛出一个错误

System.InvalidOperationException: 'Both DataSource and DataSourceID are defined on 'DataList1'. Remove one definition.'

有什么想法吗?有没有办法重置数据源?

我的html

<form id="form1" runat="server">
    <div>
    </div>
    <asp:DataList ID="DataList1" runat="server" DataKeyField="ID" DataSourceID="SqlDataSource1" RepeatColumns="3" RepeatDirection="Horizontal">
        <ItemTemplate>
            <asp:Image ID="Image1" runat="server" ImageUrl='<%# Eval("Image") %>' Width="300px" />
            <br />
            <asp:Label ID="Label1" runat="server" Text='<%# Eval("Name") %>'></asp:Label>
            <br />
        </ItemTemplate>
    </asp:DataList>
    <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString %>" ProviderName="<%$ ConnectionStrings:ConnectionString.ProviderName %>" SelectCommand="SELECT * FROM [items]"></asp:SqlDataSource>
    <br />
    <asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString %>" ProviderName="<%$ ConnectionStrings:ConnectionString.ProviderName %>" SelectCommand="SELECT * FROM [items] WHERE ([Name] = ?)">
        <SelectParameters>
            <asp:ControlParameter ControlID="TextBox1" Name="Name" PropertyName="Text" Type="String" />
        </SelectParameters>
    </asp:SqlDataSource>
    <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />

从错误中,你需要将DataSourceDataSourceID定义为DataList,而不是像DataList HTML中那样同时定义两者DataSourceID被定义,一旦你将定义另一个数据DataSource,你需要清除它。

DataList1.DataSourceID = null;
DataList1.DataSource = SqlDataSource1;
DataList1.DataBind();

或从 DataList HTML 中删除 DataSourceID="SqlDataSource1" 并在页面加载中定义 DataSource 然后您可以将 DataList1.DataSource 设置为需要 DataSource直接。

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        DataList1.DataSource = SqlDataSource2;
        DataList1.DataBind();
    }
}

protected void Button1_Click(object sender, EventArgs e)
{
    DataList1.DataSource = SqlDataSource1;
    DataList1.DataBind();
}