更改DataSource后,C#Repeater聚焦第一个元素

时间:2016-01-20 08:16:21

标签: c# asp.net

我有一个带有某个DataSource的Repeater(包含一个图像列表)。 Repeater保存ImageButtons。

aspx:

<asp:Panel ID="panSearch" runat="server" ScrollBars="Vertical" BorderColor="#333333" BorderStyle="Inset" Width="500" Height="200">
    <asp:Repeater ID="Repeater" runat="server">
        <ItemTemplate> 
            <asp:ImageButton OnClick="imgSearchResult_Click" BackColor="#333333" ID="imgSearchResult" height="32" width="32" runat="server" ImageUrl='<%# Eval("ImageUrl") %>'/> 
        </ItemTemplate>
    </asp:Repeater>
</asp:Panel> 

此外,我有一个TextBox,它在代码隐藏中有一个TextChanged事件。我在那里做了一些事情,最后,我的Repeater的DataSource将被一个新的图像列表覆盖(这些图像被放入ImageButtons)。

Repeater.DataSource = ImageList;
Repeater.DataBind();

我的问题:每当我的Repeater.DataSource发生变化时,它都会“点击”Repeater中的第一个ImageButton。我该如何防止这种情况发生?

完整代码:

My TextBox:

<asp:TextBox ID="textSearch" runat="server" Width="80" OnTextChanged="textSearch_TextChanged" ForeColor="Black" />

我的TextChanged事件:

protected void textSearch_TextChanged(object sender, EventArgs e)
{
    string[] filesindirectory = Directory.GetFiles(Server.MapPath("~/Images/ORAS"));
    List<System.Web.UI.WebControls.Image> ImageList = new List<System.Web.UI.WebControls.Image>(filesindirectory.Count());

    foreach (string item in filesindirectory)
    {
        System.Web.UI.WebControls.Image myImage= new System.Web.UI.WebControls.Image();
        myImage.ImageUrl = (String.Format("~/Images/ORAS/{0}", System.IO.Path.GetFileName(item)));
        ImageList.Add(myImage);
    }
    Repeater.DataSource = ImageList;
    Repeater.DataBind();
}

当我点击Repeater中的ImageButton时(在我的TextBox中的文本被更改时执行):

protected void imgSearchResult_Click(object sender, ImageClickEventArgs e)
{
    var selectedImage = sender as ImageButton;
    if (img1.ImageUrl == "~/Images/ORAS/Empty/000.png")
    {
        img1.ImageUrl = selectedImage.ImageUrl;
    }
    else if (img2.ImageUrl == "~/Images/ORAS/Empty/000.png")
    {
        img2.ImageUrl = selectedImage.ImageUrl;
    }
    else if (img3.ImageUrl == "~/Images/ORAS/Empty/000.png")
    {
        img3.ImageUrl = selectedImage.ImageUrl;
    }
    else if (img4.ImageUrl == "~/Images/ORAS/Empty/000.png")
    {
        img4.ImageUrl = selectedImage.ImageUrl;
    }
    else if (img5.ImageUrl == "~/Images/ORAS/Empty/000.png")
    {
        img5.ImageUrl = selectedImage.ImageUrl;
    }
    else if (img6.ImageUrl == "~/Images/ORAS/Empty/000.png")
    {
        img6.ImageUrl = selectedImage.ImageUrl;
    }
    else
    {
        ErrorMessage("Please remove one Image first!", true);
    }
}

页面加载:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        img1.ImageUrl = "~/Images/ORAS/Empty/000.png";
        img2.ImageUrl = "~/Images/ORAS/Empty/000.png";
        img3.ImageUrl = "~/Images/ORAS/Empty/000.png";
        img4.ImageUrl = "~/Images/ORAS/Empty/000.png";
        img5.ImageUrl = "~/Images/ORAS/Empty/000.png";
        img6.ImageUrl = "~/Images/ORAS/Empty/000.png";
        LoadImages();
    }
}

(LoadImages几乎是我TextChanged函数中的1:1)

1 个答案:

答案 0 :(得分:1)

我真的不确定ASP.NET WebForms如何(为什么)这样做,但是如果你点击Enter并且表单回发,它将找到第一个实现if (r%256==0) {fflush(stdout); cout << (static_cast<double>(r) / static_cast<double>(Weight(n+1, 4, d))) << "\r";} 的控件并执行绑定到的任何事件那。 IPostBackEventHandler实现了它,这就是为什么它会一直触发点击事件,即使你没有点击它。而且,再次,只有你按Enter键。

我认为这种行为的发生是因为发回的数据 - ImageButton__EVENTTARGET - 是空的。然后ASP.NET变得疯狂。

您可以通过在页面顶部(或母版页)放置一个虚拟按钮来解决它,并使用style属性将其隐藏。这样:

__EVENTARGUMENT

然后在你的页面(或母版页)的初始化或加载中放入

<asp:Button ID="dummy" runat="server" style="display:none" />

这将强制按钮捕获输入按下而不是任意图像按钮。