asp.net中的幻灯片C#停在第一张图片

时间:2016-04-29 04:22:08

标签: c# asp.net updatepanel eventtrigger

我学习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>

3 个答案:

答案 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函数之外的某个地方。