我是asp.net 初学的。 将dropDownList 控件与SqlDateReader绑定后。 发现在提交时的按钮click事件中,用dropDownList.SelectedValue取出的值 总是初化参数。
这是为什么呢?
大概如下 :<asp:dropdownlist ID="lstChannel" runat="server" DataTextField="Tname" DataValueField="id"/>
---------------------------------------------------------------------------
SqlConn1.Open();
SqlCmd1=new SqlCommand("Select * from Cchannel",SqlConn1);
Reader1=SqlCmd1.ExecuteReader();
lstChannel.DataBind();
lstChannel.DataSource=Reader1;
void btmCmdOK_Click(object sender , EventArgs e) //------------OK按钮——
{
Response.Write(lstChannel.SelectedValue); //这里无论网页上怎么选,都是输出初始
                                                   //不知道为什么。}

解决方案 »

  1.   

    void Page_Load(object sender, EventArgs e)
    {
       if (!
           SqlConn1.Open();
           SqlCmd1=new SqlCommand("Select * from Cchannel",SqlConn1);
           Reader1=SqlCmd1.ExecuteReader();
           lstChannel.DataBind();
           lstChannel.DataSource=Reader1;
    }
      

  2.   

    不好意思, 不怎么发送了.void Page_Load(object sender, EventArgs e)
    {
       // 一定要加这个条件来判断一下.
       if (! IsPostBack )
       {
           SqlConn1.Open();
           SqlCmd1=new SqlCommand("Select * from Cchannel",SqlConn1);
           Reader1=SqlCmd1.ExecuteReader();
           lstChannel.DataBind();
           lstChannel.DataSource=Reader1;
       }
    }
      

  3.   

    你不先指定数据源,怎么就去绑定了呢?if(!IsPostBack)
    {
       SqlConn1.Open();
       SqlCmd1=new SqlCommand("Select * from Cchannel",SqlConn1);
       Reader1=SqlCmd1.ExecuteReader();
       lstChannel.DataSource=Reader1;   // 这里应该先指定数据源
       lstChannel.DataBind();           //然后在绑定
    }
      

  4.   

    //我有个方法比较麻烦,通用性较强
    if (! IsPostBack )
    {
        DisplayFlowName(DropDownList控件名称);
    }
    public void DisplayFlowName(DropDownList ddlstTemp)
    {
        //建立内存表
        DataTable dt=new DataTable();
        DataRow dr;
        dt.Columns.Add(new DataColumn("FlowID", typeof(string)));
        dt.Columns.Add(new DataColumn("FlowName",typeof(string)));
        strSql="select FlowID,FlowName from FlowName;
        SqlDataReader sdrDr=GetSqlDataReader(strSql);
        while(sdrDr.Read())
        {
    dr=dt.NewRow();
    dr[0]=sdrDr.GetString(0).Trim();
    dr[1]=sdrDr.GetString(1).Trim();
    dt.Rows.Add(dr);
        }
           ddlstTemp.Items.Clear();
           ddlstTemp.DataSource=dt;
           ddlstTemp.DataTextField="FlowName";
           ddlstTemp.DataValueField="FlowID";
           ddlstTemp.DataBind();
           CloseDataBase();//关闭
    }
    //自定义方法
    public SqlDataReader GetSqlDataReader(string strSql)
    {
    /* 1、编写:
    *  2、功能:通过SQL语句显示显示其他相关的信息
    *  3、参数:SQL语句
    *  4、返回值: SqlDataReader
    */
    SqlDataReader sdrEoa;
    OpenDataBase();//打开数据库
    SqlCommand cmdTemp;
    cmdTemp=new SqlCommand(strSql,conn);
    sdrEoa=cmdTemp.ExecuteReader();
    return sdrEoa;
    }
      

  5.   

    lstChannel.DataSource=Reader1;   先指定数据源
    lstChannel.DataBind();           在绑定
      

  6.   

    先指定数据源,后再绑定
    且要注意页面的初始载入的影响,它有可能让SelectedIndex的值恢复为默认的值
    你可以用断点的调试方法(这方法很管用)找出错误在哪。
      

  7.   

    <asp:DropDownList ID="mydropdownlist" DataSource='<%# FristCensorResult(DataBinder.Eval(Container.DataItem,"zyid")) %>' Runat="server" >
    </asp:DropDownList>
    后台:
    public ArrayList  FristCensorResult(object  popo)
    {
    SqlDataReader sdrEoa;
    OpenDataBase();//打开数据库
    SqlCommand cmdTemp;
    cmdTemp=new SqlCommand(strSql,conn);
    sdrEoa=cmdTemp.ExecuteReader();
             return sdrEoa;
    }
      

  8.   

    SqlCmd1=new SqlCommand("Select * from Cchannel",SqlConn1);
    Reader1=SqlCmd1.ExecuteReader();lstChannel.DataSource=Reader1;
    lstChannel.DataBind();
    先指定数据源再帮定
      

  9.   

    在那里绑定得?
    if(!IsPostBack)
    {}
      

  10.   

    按 exboy(kuku) 方法就OK啦. 关键问题出在 一定要加if (!IsPostBack)这样判断.谢谢各位啦~~ :D