【问题标题】:asp .net dropdownlist selectedindex not workingasp .net dropdownlist selectedindex 不起作用
【发布时间】:2011-08-29 22:09:23
【问题描述】:

我有以下代码:

DataRow CreateRow(DataTable dt, string name, string country)
    {
        DataRow dr = dt.NewRow();
        dr["Name"] = name;
        dr["Country"] = country;
        return dr;
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        // creating the data table
        DataTable dt = new DataTable("Student Details");

        // adding two columns Name and Country
        dt.Columns.Add("Name", typeof(String));
        dt.Columns.Add("Country", typeof(String));

        // create 3 rows        
        dt.Rows.Add(CreateRow(dt, "Varun", "India"));
        dt.Rows.Add(CreateRow(dt, "Li", "China"));
        dt.Rows.Add(CreateRow(dt, "Yishan", "China"));

        // create a data view 
        DataView dv = new DataView(dt);

        DropDownList1.DataSource = dv;
        DropDownList1.DataTextField = "Name";
        DropDownList1.DataValueField = "Country";
        DropDownList1.DataBind();
    }
    protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
    {
        int x = DropDownList1.SelectedIndex;
        int temp = 0;
        temp++;
    }

标记看起来像这样:

<body>
    <form id="form1" runat="server">
    <div>

        <asp:Label ID="Label1" runat="server"></asp:Label>
        <br />
        <br />
        <asp:DropDownList ID="DropDownList1" runat="server" 
            onselectedindexchanged="DropDownList1_SelectedIndexChanged"
            AutoPostBack="true">
        </asp:DropDownList>

    </div>
    </form>
</body>

问题是无论我选择什么标签总是显示 Varun。我调试了代码,发现“DropDownList1.SelectedIndex”由于某种原因总是返回0。

我不知道为什么会这样。每次我从下拉列表中选择某些内容时,都会调用函数“DropDownList1_SelectedIndexChanged”。

谢谢

【问题讨论】:

    标签: asp.net drop-down-menu selectedindex


    【解决方案1】:

    看起来您正在绑定 Page_Load 中的下拉菜单...

    请记住,当下拉列表更改时,它会回发 (AutoPostBack='True'),并且由于您在 Page_Load 上进行绑定,因此每次更改索引时它都会重新绑定...不是您想要的!

    你应该这样做:

    if (!IsPostBack)
    {  
        BindDropDownList1();      
    }
    

    【讨论】:

      【解决方案2】:

      确保 ViewState 已启用(用于更改事件),并将 OnLoad 中的代码移动到 OnInit。这将防止 ViewState 在 Init 之后和 Load 之前被覆盖。

      您还应该将初始化代码包含在IsPostback 检查中,以避免在每次请求时都加载数据。

      【讨论】:

      • 感谢 TheCodeKing 的替代方案。
      【解决方案3】:

      您可以使用此代码:

        foreach (ListItem item in DropDownList1.Items)
           {
                  if (item.Text == defaultText) 
                  {
                      item.Selected = true;
                      break;
                  }
           }
      

      【讨论】:

        【解决方案4】:

        您可以尝试覆盖页面的OnPreRender 方法:

        protected override OnPreRender(EventArgs e)
        {
            DropDownList1.SelectedIndex = Convert.ToInt32(ViewState["PageIndex"]);
        
            base.OnPreRender(e);
        }
        

        另外,请确保 EnableViewState 设置为 True

        【讨论】:

          猜你喜欢
          • 2011-03-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-05-16
          相关资源
          最近更新 更多