如何取得gridview 中dropdownlist选中项?其中dropdownlist控件是通过rowdatabind方法附加上的,现在想取得去选中值,不知怎么获取,请指点、。
绑定方法: protected void personalpaiban_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {            //添加dropdownlist,并给其赋值
            if (e.Row.RowIndex >= 0)
            {
                for (int i = 2; i < e.Row.Cells.Count; i++)
                {
                    DropDownList ddl = new DropDownList();
                    ddl.ID = "DropDownList" + i.ToString();                    ddl.Items.Add(new ListItem("早", "1"));
                    ddl.Items.Add(new ListItem("中", "2"));
                    ddl.Items.Add(new ListItem("晚", "3"));
                    ddl.Items.Add(new ListItem("休", "4"));
                    //把原表中数据通过dropdownlist反映出来
                    ddl.SelectedIndex = Convert.ToInt32(e.Row.Cells[i].Text.ToString()) - 1;                    e.Row.Cells[i].Controls.Add(ddl);
                }
            }
           
        }
    }

解决方案 »

  1.   

    写错了,是personalpaiban_RowDataBound(object sender, GridViewRowEventArgs e)方法添加的dropdownlist控件
      

  2.   

    DropDownList DropDownList1 = (DropDownList)personalpaiban.Rows[i].FindControl("DropDownList1");
    string a1 = DropDownList1.SelectedValue;大致是这样的。。你需要看实际情况 改Rows[i]中的i 和你动态生成的dropdownlist的ID
      

  3.   

    你应该是在修改方法里获取值吧?
    那这样的话就是rowcommand里:DropDownList DDL = (DropDownList)e.Row.FindControl("DropDownList1");
    string a1 = DropDownList1.SelectedValue;
      

  4.   

    ((DropDownList)GridView1.Rows[rowIndex].Cells[2].controls[0]).value
    类似写法
      

  5.   

    FindControl()
    上面的都说清楚了,偶来接分。最好用DropDownList的名。
      

  6.   

    <ItemTemplate> 
    <asp:DropDownList ID="ddlSort" runat="server" Width="98%">
      </asp:DropDownList>
     <asp:HiddenField ID="Hd_Sort" runat="server" Value='<%# Eval("BalSort")%>' />
    </ItemTemplate>
     protected void gv_RowDataBound(object sender, GridViewRowEventArgs e)
      {
      if (e.Row.RowIndex != -1)
      { if (e.Row.RowState == DataControlRowState.Edit || e.Row.RowState == (DataControlRowState.Alternate | DataControlRowState.Edit))
      {
      ((DropDownList)e.Row.FindControl("ddlSort")).SelectedValue = ((HiddenField)e.Row.FindControl("Hd_Sort")).Value;
      }
      }
      } protected void gv_RowEditing(object sender, GridViewEditEventArgs e)
      {
      gv.EditIndex = e.NewEditIndex;
      string strSort = ((DropDownList)gv.Rows[e.NewEditIndex].FindControl("ddlSort")).SelectedValue.Trim();
      gv.EditIndex = -1;
      BindData();
      } 
      

  7.   

    可是我的dropdownlist是通过gridview 的rowdatabound添加上的,因此不知到如何取到,我是在button的rowcommand中做的,可是存在问题:
    代码如下: protected void gvpaiban_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            Response.Write("<script>alert('" + gvpaiban.Rows.Count + "sdfsadf" + gvpaiban.Columns.Count + "')</script>");
            if (e.CommandName == "updates")
            {
                string userid = e.CommandArgument.ToString();//得到主键id
                GridViewRow row = (GridViewRow)((Control)e.CommandSource).Parent.Parent;
                Response.Write("<script>alert('"+gvpaiban.Rows.Count+"sdfsadf"+gvpaiban.Columns.Count+"')</script>");
                for (int i = 3; i < gvpaiban.Columns.Count; i++)
                {
                    //得到列标题
                    string date = gvpaiban.Columns[i].HeaderText;
                    //得到单元格中dropdownlist选中值
                    //获的单元格中dropdownlist的id
                    int j = i - 2;
                    string ddlid = "DropDownList" + j.ToString();
                    DropDownList ddl = (DropDownList)row.FindControl(ddlid);
                    int bz = ddl.SelectedIndex + 1;
                    Response.Write("<script>alert('"+bz+"')</script>");
                }
            }
        }
    结果出现问题,gridview的列才有1列,也就是只有按钮列,其他动态生成的都没有,更别提取得dropdownlist了,请各位帮忙想一下解决办法。。
      

  8.   

    是完全可以的!
    在Page_Load中再要创建DropDownList,如:
        protected void Page_Load(object sender, EventArgs e)
        {
            if (IsPostBack)//回发(没有!号
            {
                for (int j = 0; j < gvpaiban.Rows.Count; j++)
                {
                    for (int i = 2; i < gvpaiban.Columns.Count; i++)
                    {
                        DropDownList ddl = new DropDownList();
                        ddl.ID = "DropDownList" + i.ToString();                    ddl.Items.Add(new ListItem("早", "1"));
                        ddl.Items.Add(new ListItem("中", "2"));
                        ddl.Items.Add(new ListItem("晚", "3"));
                        ddl.Items.Add(new ListItem("休", "4"));
                        gvpaiban.Rows[j].Cells[i].Controls.Add(ddl);
                        // ddl.SelectedIndex = .......
                    }
                }
            }
        }    //gvpaiban的RowCommand中获得选中值
        protected void gvpaiban_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            if (e.CommandName == "Update")
            {
                Button btn =(Button)e.CommandSource;
                int index = ((GridViewRow)btn.NamingContainer).RowIndex;//获得行号
                string ddlItem = "";
                for (int i = 2; i < gvpaiban.Columns.Count; i++)
                    ddlItem += ((DropDownList)gvpaiban.Rows[index].Cells[7].FindControl("DropDownList" + i.ToString())).SelectedItem.ToString() + ",";
                Response.Write(ddlItem);//这就是你要的值
            }
        }
      

  9.   

    稍微有误!应该是:7改成i
    ddlItem += ((DropDownList)gvpaiban.Rows[index].Cells[i].FindControl("DropDownList" + i.ToString())).SelectedItem.ToString() + ",";
      

  10.   


    还是不行,因为gvpaiban的列,还是一列,gvpaiban_RowCommand中
    for (int i = 2; i < gvpaiban.Columns.Count; i++)
                    ddlItem += ((DropDownList)gvpaiban.Rows[index].Cells[7].FindControl("DropDownList" + i.ToString())).SelectedItem.ToString() + ",";
                Response.Write(ddlItem);//这就是你要的值for循环根本就没有执行,恳求各位支持。。
      

  11.   

    没循环??
    gvpaiban.Columns.Count是多少!我昨天做了一下完全没问题!
    动态添加控件的关键是页面回发还要重新创建!
    其他应该没什么两样!!
      

  12.   

    网上查了一下说是需要动态添加columns;可是如果动态添加的话,那个按钮我不会添加进去。。
    这是网上的解释:
    GridView.Columns.Count,莫大的一个0跃然纸上,开始当然是以为自己的代码有问题,反复检查后,确信一点问题都没有,驱猫上网百一下和G一下,发现遇到这个问题的朋友还不少.原来服务器端DataSet或者DateTbale之流绑定给GridView之后,GridView只会按照字段的顺序显示所有列,此时无论GridView的AutoGenerateColumns属性启用还是不启用,Columns对象的Count将为0,因为GridView还是会自动生成的列,而自动生成列是不会放入到Columns集合中去的.
      

  13.   

    其实我的本意是把这个表以表格的形式显示出来,而班种则希望通过dropdownlist 反映出来,可是因为每月的天数有所不同所以用了gridview自动生成字段的形式,dropdownlist则在row_databound中绑定,然后读取出相应位置处班种值,可是无法完成更新,主要是我无法取到dropdownlist,希望(口口加一)可以给个思路,谢谢。。
    数据库中数据如下所示:希望得到如题所示的效果 
      

  14.   

    你的问题现在是要获取Columns.Count,
    因为你是代码绑定,直接不能获得Columns.Count,
    但可以通过以下的方法获得,
    加一个隐藏域放Columns.Count,然后再IsPostBack中调用
        protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowIndex == 0)
            {
                TableCellCollection cells = e.Row.Cells;
                HiddenField1.Value = cells.Count.ToString();//这是Columns.Count
            }
        }
      

  15.   

    可是现在有出现问题,说是索引超出范围,我在ispostback中的方法
    if (IsPostBack)//回发(没有!号
            { int colnum = Convert.ToInt32(((HiddenField)gvpaiban.Rows[0].FindControl("HiddenField1")).Value);//获得隐藏域值
                for (int j = 0; j < gvpaiban.Rows.Count; j++)
                {
                    for (int i = 2; i <colnum; i++)
                    {
                        DropDownList ddl = new DropDownList();
                        ddl.ID = "DropDownList" + i.ToString();                    ddl.Items.Add(new ListItem("早", "1"));
                        ddl.Items.Add(new ListItem("中", "2"));
                        ddl.Items.Add(new ListItem("晚", "3"));
                        ddl.Items.Add(new ListItem("休", "4"));
                        gvpaiban.Rows[j].Cells[i].Controls.Add(ddl);
                        // ddl.SelectedIndex = .......
                    }
                }
            }
    蓝色部分出错
      

  16.   

    获得colnum,只要简单的Convert.ToInt32(HiddenField1.Value)
      

  17.   

      /// <summary>
        /// 在创建行时添加
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void personalpaiban_RowCreated(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowIndex == 0)
            {
                TableCellCollection cells = e.Row.Cells;
                HiddenField HiddenField1 = new HiddenField();//获得的hiddenfiled对象
                HiddenField1.Value = cells.Count.ToString();//这是Columns.Count
            }    }
    添加隐藏域不是这样添加吗?如果没有第二句的话,提示没有找到HiddenField1,同样如果获得HiddenField1,只用Convert.ToInt32(HiddenField1.Value)
    也会提示没有找到HiddenField1
      

  18.   

    兄弟:
    拖一个隐藏域的控件就可以了!
    或者用ViewState也可以,总之是保存一下数据!!
      

  19.   

    列数问题解决了,可是取不到dropdownlist中选中值:
     //gvpaiban的RowCommand中获得选中值
        protected void gvpaiban_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            if (e.CommandName == "Update")
            {
                Button btn =(Button)e.CommandSource;
                int index = ((GridViewRow)btn.NamingContainer).RowIndex;//获得行号
                string ddlItem = "";
                for (int i = 2; i < gvpaiban.Columns.Count; i++)
                    ddlItem += ((DropDownList)gvpaiban.Rows[index].Cells[i].FindControl("DropDownList" + i.ToString())).SelectedItem.ToString() + ",";
                Response.Write(ddlItem);//这就是你要的值
            }
        }提示未将对象引用设置到对象的实例。。
      

  20.   

    通过 Button btn = (Button)e.CommandSource;
                int index = ((GridViewRow)btn.NamingContainer).RowIndex;//获得行号
                //string ddlItem = "";
                //for (int i = 2; i < colnum; i++)
                //    ddlItem += ((DropDownList)personalpaiban.Rows[index].Cells[i].FindControl("DropDownList" + i.ToString())).SelectedItem.ToString() + ",";
               //Response.Write("<script>alert('"+ddlItem+"');</script>");//这就是你要的值
                string bz = personalpaiban.Rows[index].Cells[3].Text;
                Response.Write("<script>alert('" + bz + "');</script>");
    可以取得dropdownlist位置处原来的值,是不是因为我的dropdownlist是rowdatabound添加上去的缘故啊。
      

  21.   

    (口口加一) 
    大哥,帮忙看看啊,我这真的取不到dropdownlist的值,试了很多次了,还是不行。。
      

  22.   

    在RowDataBound事件中加写了判断按Edit按钮的代码!其它代码不变试试,应该没问题了!
    前提是GridView的列没有手动绑定!
        protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                if ((e.Row.RowState == DataControlRowState.Edit) || (e.Row.RowState ==( DataControlRowState.Edit | DataControlRowState.Alternate)))
                {
                    for (int i = 2; i < e.Row.Cells.Count; i++)
                    {
                        DropDownList ddl = new DropDownList();
                        ddl.ID = "DropDownList" + i.ToString();                    ddl.Items.Add(new ListItem("早", "1"));
                        ddl.Items.Add(new ListItem("中", "2"));
                        ddl.Items.Add(new ListItem("晚", "3"));
                        ddl.Items.Add(new ListItem("休", "4"));
                        e.Row.Cells[i].Controls.Add(ddl);
                        ddl.SelectedIndex = Convert.ToInt32(((TextBox)e.Row.Cells[i].Controls[0]).Text);//在编辑状态下是TextBox
                        ((TextBox)e.Row.Cells[i].Controls[0]).Visible = false;//隐藏编辑状态下的TextBox
                    }
                }
                else if (e.Row.RowState == DataControlRowState.Normal | e.Row.RowState == DataControlRowState.Alternate)
                {
                    for (int i = 2; i < e.Row.Cells.Count; i++)
                    {
                        DropDownList ddl = new DropDownList();
                        ddl.ID = "DropDownList" + i.ToString();
                        ddl.Items.Add(new ListItem("早", "1"));
                        ddl.Items.Add(new ListItem("中", "2"));
                        ddl.Items.Add(new ListItem("晚", "3"));
                        ddl.Items.Add(new ListItem("休", "4"));
                        //把原表中数据通过dropdownlist反映出来
                           e.Row.Cells[i].Controls.Add(ddl);
                        ddl.SelectedIndex = Convert.ToInt32(e.Row.Cells[i].Text.ToString());
                    }
                }
            }
        }