我有一个带有某个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)
答案 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" />
这将强制按钮捕获输入按下而不是任意图像按钮。