如何取得gridview 中dropdownlist选中项

feifei_luntan 2010-10-19 01:59:31
如何取得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);
}
}

}
}
...全文
628 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
feifei_luntan 2010-10-22
  • 打赏
  • 举报
回复
谢谢了,结贴了
feifei_luntan 2010-10-21
  • 打赏
  • 举报
回复
可是现在有出现问题,说是索引超出范围,我在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 = .......
}
}
}
蓝色部分出错
koukoujiayi 2010-10-21
  • 打赏
  • 举报
回复
你的问题现在是要获取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
}
}
feifei_luntan 2010-10-21
  • 打赏
  • 举报
回复
其实我的本意是把这个表以表格的形式显示出来,而班种则希望通过dropdownlist 反映出来,可是因为每月的天数有所不同所以用了gridview自动生成字段的形式,dropdownlist则在row_databound中绑定,然后读取出相应位置处班种值,可是无法完成更新,主要是我无法取到dropdownlist,希望(口口加一)可以给个思路,谢谢。。
数据库中数据如下所示:

希望得到如题所示的效果
feifei_luntan 2010-10-21
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 koukoujiayi 的回复:]
没循环??
gvpaiban.Columns.Count是多少!

我昨天做了一下完全没问题!
动态添加控件的关键是页面回发还要重新创建!
其他应该没什么两样!!
[/Quote]
网上查了一下说是需要动态添加columns;可是如果动态添加的话,那个按钮我不会添加进去。。
这是网上的解释:

GridView.Columns.Count,莫大的一个0跃然纸上,开始当然是以为自己的代码有问题,反复检查后,确信一点问题都没有,驱猫上网百一下和G一下,发现遇到这个问题的朋友还不少.

原来服务器端DataSet或者DateTbale之流绑定给GridView之后,GridView只会按照字段的顺序显示所有列,此时无论GridView的AutoGenerateColumns属性启用还是不启用,Columns对象的Count将为0,因为GridView还是会自动生成的列,而自动生成列是不会放入到Columns集合中去的.

koukoujiayi 2010-10-21
  • 打赏
  • 举报
回复
没循环??
gvpaiban.Columns.Count是多少!

我昨天做了一下完全没问题!
动态添加控件的关键是页面回发还要重新创建!
其他应该没什么两样!!
feifei_luntan 2010-10-21
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 koukoujiayi 的回复:]
是完全可以的!
在Page_Load中再要创建DropDownList,如:

C# code
protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack)//回发(没有!号
{
for (int j = 0; j < gvpaib……
[/Quote]

还是不行,因为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循环根本就没有执行,恳求各位支持。。
koukoujiayi 2010-10-21
  • 打赏
  • 举报
回复
在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());
}
}
}
}
feifei_luntan 2010-10-21
  • 打赏
  • 举报
回复
(口口加一)
大哥,帮忙看看啊,我这真的取不到dropdownlist的值,试了很多次了,还是不行。。
feifei_luntan 2010-10-21
  • 打赏
  • 举报
回复
通过
 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添加上去的缘故啊。
feifei_luntan 2010-10-21
  • 打赏
  • 举报
回复
列数问题解决了,可是取不到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);//这就是你要的值
}
}

提示未将对象引用设置到对象的实例。。
koukoujiayi 2010-10-21
  • 打赏
  • 举报
回复
兄弟:
拖一个隐藏域的控件就可以了!
或者用ViewState也可以,总之是保存一下数据!!
feifei_luntan 2010-10-21
  • 打赏
  • 举报
回复
/// <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
koukoujiayi 2010-10-21
  • 打赏
  • 举报
回复
获得colnum,只要简单的Convert.ToInt32(HiddenField1.Value)
koukoujiayi 2010-10-20
  • 打赏
  • 举报
回复
稍微有误!应该是:7改成i
ddlItem += ((DropDownList)gvpaiban.Rows[index].Cells[i].FindControl("DropDownList" + i.ToString())).SelectedItem.ToString() + ",";
koukoujiayi 2010-10-20
  • 打赏
  • 举报
回复
是完全可以的!
在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);//这就是你要的值
}
}
feifei_luntan 2010-10-20
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 feifei_luntan 的回复:]
可是我的dropdownlist是通过gridview 的rowdatabound添加上的,因此不知到如何取到,我是在button的rowcommand中做的,可是存在问题:
代码如下:

C# code

protected void gvpaiban_RowCommand(object sender, GridViewCommandEventArgs e)
{
……
[/Quote]
请高手帮忙看看如何稻谷,我这真是燥死了。。。
daifangci 2010-10-20
  • 打赏
  • 举报
回复
databing事件里面
feifei_luntan 2010-10-20
  • 打赏
  • 举报
回复
可是我的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了,请各位帮忙想一下解决办法。。
wuyq11 2010-10-19
  • 打赏
  • 举报
回复
<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();
}
加载更多回复(5)

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧