如何实现绑定DataGrid中的子控件? 举个例子,有一个DataGrid已经绑定到了一个数据源,用的TemplateColumn,然后其中有一列在点击EditButton后会是一个DropDownList,现在要将这个DropDownList绑定到一个数据源,怎么实现? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 1.*.aspx文件 <ItemTemplate> <asp:Label id=Label2 runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.状态") %>'> </asp:Label> </ItemTemplate><EditItemTemplate> <asp:DropDownList id="DropDownList1" runat="server" Width="78px" SelectedIndex='<%# GetStatusIndex(DataBinder.Eval(Container,"DataItem.状态").ToString())%>'> <asp:ListItem Value="未完成">未完成</asp:ListItem> <asp:ListItem Value="完成">完成</asp:ListItem> </asp:DropDownList> </EditItemTemplate>2. *.cs文件代码(一般只有这个事件中用到取值) private void DataGrid1_UpdateCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e) { DropDownList status=(DropDownList)e.Item.FindControl("DropDownList1"); ...; //在这里对status进行绑定 }绑定1.从DS中绑定this.dpdAreas.DataTextField = "AreaName";this.dpdAreas.DataValueField = "AreaID";this.dpdAreas.DataSource = DS;this.dpdAreas.DataBind();你的DS中必须有AreaName和AreaID两个字段2.自定义数据绑定for(int i = 10;i <= 50; i += 10){ ListItem ls = new ListItem(); ls.Text = i.ToString()+"人"; ls.Value = i.ToString(); this.ddlDisplayNum.Items.Add(ls);}this.ddlDisplayNum.Items.Add(new ListItem("全部","")); this.ddlDisplayNum.SelectedValue = "20"; 获取数值我知道,问题在于在DataGrid中的DropDownList控件是要通过FindControl来查找的,而绑定那个DropDownList似乎只有在点击了EditCommand之后触发,这个时候找到的只有是ItemTemplate里的Label控件,UpdateCommand事件的时候DropDownList已经显示了,没法绑定.this.*****只能获取当前页面上的控件,否则会报出没有将对象引用设置到对象实例的错误... 这是以前写的 代码 你参考一下页面代码<Columns></Columns>里面加<asp:TemplateColumn HeaderText=TitleOfCourtesy> <ItemTemplate> <asp:Label ID=Label1 Runat=server Text='<%#DataBinder.Eval(Container,"DataItem.TitleOfCourtesy")%>'></asp:Label> </ItemTemplate> <EditItemTemplate><asp:DropDownList ID =drpTitle Runat=server DataSource='<%#BindTheTitle()%>' DataTextField="TitleOfCourtesy" DataValueField="TitleOfCourtesy"></asp:DropDownList></EditItemTemplate> </asp:TemplateColumn>后台代码public SqlDataAdapter BindTheTitle(){ SqlConnection Conn=new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["msdsn"]);string SQL1="select Address from Users "; SqlCommand comm1=new SqlCommand(SQL1,Conn );Conn.opne(); return comm1.ExecuteReader(CommandBehavior.Close.Connection)} CheckBoxList mycblist;int count = DataList1.Items.Count;foreach( DataListItem item in DataList1.Items){ mycblist = (CheckBoxList)item.FindControl("CheckBoxList1"); mycblist.DataSource = CreateDataSource() ; mycblist.DataTextField = "StringValue"; mycblist.DataValueField = "IntegerValue"; mycblist.DataBind();} CheckBoxList mycblist;int count = DataList1.Items.Count; foreach( DataListItem item in DataList1.Items) { mycblist = (CheckBoxList)item.FindControl("CheckBoxList1"); mycblist.DataSource = CreateDataSource() ; mycblist.DataTextField = "StringValue"; mycblist.DataValueField = "IntegerValue"; mycblist.DataBind(); } 请参照下面的实例//如何在编辑时,绑定编辑行的下拉框对象此处绑定datagrid控件,注意要设定键值....................this.datagrid1.DataKeyField = "xxid";this.datagrid1.DataBind();//然后,在edit编辑事件里面//求取键值string mykeyid = this.datagrid1.Items[e.Item.ItemIndex].ToString();//求取当前行的下拉框对象DropDownList myDown = (DropDownList)this.datagrid1.Items[e.Item.ItemIndex].FindControl("下拉框ID");//根据键值从数据库中求取你所要的绑定值,如果是固定选项的话,可以不用键值sql = "select xxid,xxname from table";//根据SQL语句求取数据集DataTable mytab = 根据SQL求取数据集;//绑定myDown.DataSource = mytab;myDown.DataValueField = "xxxid";myDown.DataTextField = "xxxname";myDown.DataBind();} http://singlepine.cnblogs.com/articles/266538.html yefeihaha() ,你的例子在修改函数返回类型为DataTable以后运行通过行.其他的例子基本上都是未将对象引用设置到对象实例的错误,在于EditCommand时候,还不能FindControl到EditTemplate里面的Control,还是ItemTemplate里面的,比如Label. 一个关于HTML的问题 ajax弹出alert()的问题? 求助~~~!!批量上传 求一条SQL语句。。。 初学.net,有几个地方没明白,请教. ASP.NET1.1使用DLL提示编译错误,请指教? C#中处理整数如何可以不限制大小长度?不限int32,int64的范围?要求无限大 一个简单的连接语句: 有人告诉我“标准输入流、输出流和错误流”是什么吗? 关于usercontrol的问题 大家觉得哪个网站用的网页文本编辑器最好看最好用? 请教:关于DataGrid的问题,HELP……
<ItemTemplate>
<asp:Label id=Label2 runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.状态") %>'>
</asp:Label>
</ItemTemplate>
<EditItemTemplate> <asp:DropDownList id="DropDownList1" runat="server" Width="78px" SelectedIndex='<%# GetStatusIndex(DataBinder.Eval(Container,"DataItem.状态").ToString())%>'>
<asp:ListItem Value="未完成">未完成</asp:ListItem>
<asp:ListItem Value="完成">完成</asp:ListItem>
</asp:DropDownList>
</EditItemTemplate>
2. *.cs文件代码(一般只有这个事件中用到取值)
private void DataGrid1_UpdateCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
DropDownList status=(DropDownList)e.Item.FindControl("DropDownList1");
...; //在这里对status进行绑定 }绑定
1.从DS中绑定
this.dpdAreas.DataTextField = "AreaName";
this.dpdAreas.DataValueField = "AreaID";
this.dpdAreas.DataSource = DS;
this.dpdAreas.DataBind();你的DS中必须有AreaName和AreaID两个字段
2.自定义数据绑定
for(int i = 10;i <= 50; i += 10)
{
ListItem ls = new ListItem();
ls.Text = i.ToString()+"人";
ls.Value = i.ToString();
this.ddlDisplayNum.Items.Add(ls);
}
this.ddlDisplayNum.Items.Add(new ListItem("全部",""));
this.ddlDisplayNum.SelectedValue = "20";
this.*****只能获取当前页面上的控件,否则会报出没有将对象引用设置到对象实例的错误...
页面代码<Columns></Columns>里面加<asp:TemplateColumn HeaderText=TitleOfCourtesy>
<ItemTemplate>
<asp:Label ID=Label1 Runat=server Text='<%#DataBinder.Eval(Container,"DataItem.TitleOfCourtesy")%>'></asp:Label>
</ItemTemplate>
<EditItemTemplate><asp:DropDownList ID =drpTitle Runat=server DataSource='<%#BindTheTitle()%>' DataTextField="TitleOfCourtesy" DataValueField="TitleOfCourtesy"></asp:DropDownList></EditItemTemplate>
</asp:TemplateColumn>
后台代码
public SqlDataAdapter BindTheTitle()
{ SqlConnection Conn=new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["msdsn"]);
string SQL1="select Address from Users ";
SqlCommand comm1=new SqlCommand(SQL1,Conn );
Conn.opne();
return comm1.ExecuteReader(CommandBehavior.Close.Connection)}
int count = DataList1.Items.Count;
foreach( DataListItem item in DataList1.Items)
{
mycblist = (CheckBoxList)item.FindControl("CheckBoxList1");
mycblist.DataSource = CreateDataSource() ;
mycblist.DataTextField = "StringValue";
mycblist.DataValueField = "IntegerValue";
mycblist.DataBind();
}
int count = DataList1.Items.Count;
foreach( DataListItem item in DataList1.Items)
{
mycblist = (CheckBoxList)item.FindControl("CheckBoxList1");
mycblist.DataSource = CreateDataSource() ;
mycblist.DataTextField = "StringValue";
mycblist.DataValueField = "IntegerValue";
mycblist.DataBind();
}
....................
this.datagrid1.DataKeyField = "xxid";
this.datagrid1.DataBind();//然后,在edit编辑事件里面
//求取键值
string mykeyid = this.datagrid1.Items[e.Item.ItemIndex].ToString();
//求取当前行的下拉框对象
DropDownList myDown = (DropDownList)this.datagrid1.Items[e.Item.ItemIndex].FindControl("下拉框ID");
//根据键值从数据库中求取你所要的绑定值,如果是固定选项的话,可以不用键值
sql = "select xxid,xxname from table";
//根据SQL语句求取数据集
DataTable mytab = 根据SQL求取数据集;
//绑定
myDown.DataSource = mytab;
myDown.DataValueField = "xxxid";
myDown.DataTextField = "xxxname";
myDown.DataBind();
}
其他的例子基本上都是未将对象引用设置到对象实例的错误,在于EditCommand时候,还不能FindControl到EditTemplate里面的Control,还是ItemTemplate里面的,比如Label.