我学习asp.net。在本练习中,我想要实现的是编译3个图像幻灯片放映。页面编译并仅显示第一个图像。该页面假设更新或刷新以2秒间隔显示每个图像。将我的代码基于另一个使用条件语句的程序,基本区别在于我除了条件if语句之外还使用了一个数组。我没有使用Trigger元素,因为我所依据的代码并没有使用它。这是演讲笔记的摘录:“控件指定一个控件和事件,它将导致包含此触发器引用的UpdatePanel的部分页面更新.ControllD属性设置触发UpdatePanel异步回发的控件的名称控制。”出于某种原因,我相信我的问题可能就在这里。但因为我是新人我真的不知道。这就是我来这里寻求帮助的原因。请。如果有人能指出我正确的方向,我想我可以按照它的方式让这个程序工作。这是代码
<%@ Page Language="C#" %>
<script runat="server" type="text/vb">
private void Timer1_Tick(Object sender, EventArgs e)
{
string[] circle = new string[3];
circle[0]="red";
circle[1]="green";
circle[2]="blue";
int i = Convert.ToInt32(circle);
i = i + 1;
if (i > 3)
{
i = 1;
}
image1.ImageUrl = "red " + i + ".png";
}
</script>
<!Doctype html>
<html>
<body>
<form id="form1" runat="server">
<asp:ScriptManager runat="server" id="ScriptManager1">
</asp:ScriptManager>
<asp:UpdatePanel runat="server" id="UpdatePanel1" UpdateMode="Conditional">
<ContentTemplate>
<asp:Timer runat="server" id="Timer1" Interval="2000" OnTick="Timer1_Tick" />
<asp:Image id="image1" runat="server" ImageUrl="red.png" AlternateText="Circles" />
</ContentTemplate>
</asp:UpdatePanel>
</form>
</body>
</html>
答案 0 :(得分:1)
您是否尝试过拔出C#代码并查看控制台中发生了什么?
我猜你不能将字符串数组转换为整数
int i = Convert.ToInt32(circle);
你是说吗?
int i = circle.Length?
编辑:
除此之外你还没有正确的“i”(你可以添加一段逻辑来解析image1.ImageUrl并获取当前索引),我想你的
image1.ImageUrl = "red " + i + ".png";
实际上是
image1.ImageUrl = circle[i - 1] + ".png";
EDIT2:
要获得你想要的“i”,假设你的图像总是xxx.png并且xxx总是存在于圆形数组中,你可以通过点的位置对imageURL进行子串,得到“xxx”,然后找到匹配圆数组中的字符串,并获取它的索引。
答案 1 :(得分:1)
请原谅我那可怜的评论,但今天我赶时间。 我假设代码仅用于教育目的。 Javascript更适合您想要完成的任务。每次刷新时,服务器都会考虑使用c#或每种服务器端语言进行往返(页面重新加载)
您需要在回发中使幻灯片计数器变量持久化。 有许多方法可以完成任务数据库,会话变量,ViewState对象(也许最后一个是最好的,但你可以使用它。)
以下是您的代码的一些变体。希望它有所帮助。
<html>
<body>
<form id="form1" runat="server">
<asp:ScriptManager runat="server" ID="ScriptManager1">
</asp:ScriptManager>
<asp:UpdatePanel runat="server" ID="UpdatePanel1" UpdateMode="Conditional">
<ContentTemplate>
<asp:Timer runat="server" ID="Timer1" Interval="2000" OnTick="Timer1_Tick" />
<asp:Label Text="no images loaded" ID="LabelImageName" runat="server" />
</ContentTemplate>
</asp:UpdatePanel>
</form>
</body>
</html>
<script runat="server" type="text/vb">
string[] _arrImgNames = new string[] { "red", "green", "blue" };
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
// set counter session variable only the first time the page is loaded (not when script refreshs)
Session["counter"] = -1;
}
}
private void Timer1_Tick(Object sender, EventArgs e)
{
string textToShow = String.Format(
"Now the program shows image '{0}' "
, this.GetNextSlideImageName());
LabelImageName.Text = textToShow;
}
private string GetNextSlideImageName()
{
// get the counter from session variable
int counter = Convert.ToInt32(Session["counter"]);
// increase the counter
counter++;
if (counter >= this._arrImgNames.Length)
{
counter = 0;
}
// updating the session variable
Session["counter"] = counter;
// compose the image name
string imageName = String.Format("{0}.png", this._arrImgNames[counter]);
return imageName;
}
</script>
答案 2 :(得分:0)
我猜问题在于数组初始化。每个厚实的物体都是与柜台一起创造出来的。
string[] circle = new string[3];
circle[0]="red";
circle[1]="green";
circle[2]="blue";
int i = Convert.ToInt32(circle);
这导致计数器重置为每个厚度的起始值。 我最好将初始化代码移到Timer1_Tick函数之外的某个地方。