DataGrid如何绑定DropDownList ?

FIRSTVIP 2003-08-21 03:53:38
private void Button1_Click(object sender, System.EventArgs e)
{
////其他代码,如:DataRow dr=ds.Tables[0].NewRow();
///// DataBind();
if(DataGrid1.EditItemIndex>=0)
{
DropDownList ddl4=(DropDownList)DataGrid1.Items[DataGrid1.EditItemIndex].FindControl("DropDownList4");

ddl4.DataSource=ds3.Tables["m_law_Dclass"].DefaultView;
//错误信息:未实例化,ds3.Tables["m_law_Dclass"].DefaultView 肯定没问题
ddl4.DataTextField="class_name";
ddl4.DataValueField="id";
ddl4.DataBind();

}

我的代码有什么 问题?告诉我。
...全文
64 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
acewang 2004-01-09
  • 打赏
  • 举报
回复
DataSource的数据源必须是一个实现了System.Collections.IEnumerable 接口的对象
FIRSTVIP 2003-08-23
  • 打赏
  • 举报
回复
如果ddl4.DataSource绑定一个数组,也没问题
FIRSTVIP 2003-08-23
  • 打赏
  • 举报
回复
各位兄台,我找到原因了:这样便没问题,有谁来给我解释一下
DropDownList ddl4=(DropDownList)DataGrid1.Items[DataGrid1.EditItemIndex].FindControl("DropDownList4");

DataSet ds3=new DataSet();
DB_Date db=new DB_Date();
ds3=db.m_law_Dclass("DA3");
foreach( DataRow drli in ds3.Tables["m_law_Dclass"].Rows)
{
ListItem li=new ListItem(drli["class_name"].ToString(),drli["class_name"].ToString().Trim());
ddl4.Items.Add(li);

}

///********错误代码************
ddl4.DataSource=ds3.Tables["m_law_Dclass"].DefaultView;
//错误信息:未实例化,ds3.Tables["m_law_Dclass"].DefaultView 肯定没问题
ddl4.DataTextField="class_name";
ddl4.DataValueField="id";
ddl4.DataBind();
FIRSTVIP 2003-08-23
  • 打赏
  • 举报
回复
ddl4.DataSource绑定一个数组也没问题。

给我解释一下
stuhome 2003-08-21
  • 打赏
  • 举报
回复
to>>luckysusan(海闊天空)
我这个程序是能够正常运行的。
to>>"datagrid.items[i].findcontrol() is used to find control in itemtemplate,not in edittemplate.put dropdownlist in itemtemplate,and it'll be ok."
这种说法简直没有道理。
hq1305018 2003-08-21
  • 打赏
  • 举报
回复
你的问题我模拟了一下,应该是IsPostBack的问题。你改一下。
bobjeey 2003-08-21
  • 打赏
  • 举报
回复
private void Button1_Click(object sender, System.EventArgs e)
{
if(DataGrid1.EditItemIndex>=0)
{
DropDownList ddl4=(DropDownList)DataGrid1.Items[DataGrid1.EditItemIndex].FindControl("DropDownList4");
ddl4.DataSource=ds3.Tables["m_law_Dclass"].DefaultView;


如果仅从上面的来看,你的 ds3都没有实例化,当然会出问题啦。
如果你已经定义过 dataset ds3;那么

ds3 = new dataset(.....)
ddl4.DataSource=ds3.Tables["m_law_Dclass"].DefaultView;

这样才不会出问题
hq1305018 2003-08-21
  • 打赏
  • 举报
回复
另类的解决方法,把注释也看看,你会解决你的问题的。
public void Update_Grid(Object sender, DataGridCommandEventArgs e)
{
//DropDownList gw1 = (DropDownList)e.Item.Cells[3].Controls[3];
//for(int i=0;i<Request.Form.Count;i++)
//Response.Write(Request.Form.AllKeys[i]+"<br>");
//Response.Write(e.Item.ItemIndex.ToString().Trim()+"<br>");
//Response.Write(Request.Form["DataGrid1:_ctl"+(e.Item.ItemIndex+2).ToString().Trim()+":Dropdownlist1"]+"<br>");
//Response.Write(Request.Form["DataGrid1:_ctl"+(e.Item.ItemIndex+2).ToString().Trim()+":Dropdownlist3"]+"<br>");
SqlConnection conn=new SqlConnection(ConfigurationSettings.AppSettings["DNS"]);
conn.Open();
string hopeworkid1,hopeworkid2,hopework1,hopework2;
hopeworkid1=Request.Form["DataGrid1:_ctl"+(e.Item.ItemIndex+3).ToString().Trim()+":Dropdownlist1"].ToString().Trim();
hopeworkid2=Request.Form["DataGrid1:_ctl"+(e.Item.ItemIndex+3).ToString().Trim()+":Dropdownlist3"].ToString().Trim();
Tools myTool=new Tools();
hopework1=myTool.getText(hopeworkid1,FuncCode.Value);
hopework2=myTool.getText(hopeworkid2,FuncCode.Value);
long ID =(long)DataGrid1.DataKeys[e.Item.ItemIndex];
String Sql="update labouruser set hopeworkid1='"+hopeworkid1+"',hopework1='"+hopework1+"',hopeworkid2='"+hopeworkid2+"',hopework2='"+hopework2+"' where id="+ID.ToString().Trim();
SqlCommand sqlCmd = new SqlCommand(Sql,conn);
try
{
sqlCmd.ExecuteNonQuery();
}
catch(Exception e1)
{
Response.Write(e1.Message);
}
conn.Close();
DataGrid1.EditItemIndex = -1;
BindGrid();
}
guoyan19811021 2003-08-21
  • 打赏
  • 举报
回复
Private Sub DataGrid1_EditCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs) Handles DataGrid1.EditCommand
DataGrid1.EditItemIndex = e.Item.ItemIndex
Dim data As DataBaseInfo
Dim cnn As OleDb.OleDbConnection = Data.Connection
Dim da As New OleDb.OleDbDataAdapter("select * from log", cnn)
Dim ds As New DataSet()
da.Fill(ds, "employees")
DataGrid1.DataSource = ds
DataGrid1.DataBind()
'先重新帮定
Dim i As Integer = 0
Dim c As Integer = DataGrid1.Items.Count
For i = 0 To c - 1
Dim d As DropDownList = DataGrid1.Items(i).FindControl("DropDownList1")
If Not d Is Nothing Then
d.Items.Add(New ListItem("text", "value"))
End If
Next

End Sub
goody9807 2003-08-21
  • 打赏
  • 举报
回复
up
ga3ga3 2003-08-21
  • 打赏
  • 举报
回复
do bind the downdroplist at the "datagridbound "
wacle 2003-08-21
  • 打赏
  • 举报
回复
datagrid.items[i].findcontrol() is used to find control in itemtemplate,not in edittemplate.put dropdownlist in itemtemplate,and it'll be ok.
Cathy1 2003-08-21
  • 打赏
  • 举报
回复
Imports System.Data.SqlClient
Public Class DatagridInDatalist
Inherits System.Web.UI.Page
Protected WithEvents DataList1 As System.Web.UI.WebControls.DataList
Protected WithEvents DataGrid1 As System.Web.UI.WebControls.DataGrid
Private conn As SqlClient.SqlConnection

#Region " Web 窗体设计器生成的代码 "

'该调用是 Web 窗体设计器所必需的。
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()

End Sub

Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
'CODEGEN: 此方法调用是 Web 窗体设计器所必需的
'不要使用代码编辑器修改它。
InitializeComponent()
End Sub

#End Region

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'在此处放置初始化页的用户代码
If Not IsPostBack Then
conn = New SqlConnection("Server=fyp;UID=sa;PWD=sa;Database=Northwind")
conn.Open()
BindData()
End If
End Sub
Sub BindData()
Dim cmdSql As SqlCommand
Dim dapSql As SqlDataAdapter = New SqlDataAdapter()

Dim dtCustomer As New DataSet()
Dim strQ As String
Try
strQ = "select top 10 * from Customers"
cmdSql = New SqlCommand(strQ, conn)

dapSql.SelectCommand = cmdSql
'conn.Open()
dapSql.Fill(dtCustomer)
DataList1.DataSource = dtCustomer
DataList1.DataBind()
Catch
Throw
End Try

End Sub
Private Sub DataList1_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DataListItemEventArgs) Handles DataList1.ItemDataBound
If e.Item.ItemType = ListItemType.Item Then
Dim childGrid As DataGrid = CType(e.Item.FindControl("DataGrid1"), DataGrid)
Dim intCustomerID As String = DataList1.DataKeys(e.Item.ItemIndex)
Dim strQ As String = "Select * from Orders where CustomerID ='" & intCustomerID & "'"
childGrid.DataSource = GetDataSet(strQ)
childGrid.DataBind()
End If

End Sub
Function GetDataSet(ByVal strQ As String) As DataSet
Dim cmdSQL As SqlCommand
Dim dapSQL As SqlDataAdapter = New SqlDataAdapter()
Dim dtOrder As New DataSet()
cmdSQL = New SqlCommand(strQ, conn)

dapSQL.SelectCommand = cmdSQL

dapSQL.Fill(dtOrder)
Return dtOrder
End Function
End Class

<%@ Page Language="vb" AutoEventWireup="false" Codebehind="DatagridInDatalist.aspx.vb" Inherits="Test.DatagridInDatalist"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<title>DatagridInDatalist</title>
<meta name="GENERATOR" content="Microsoft Visual Studio .NET 7.0">
<meta name="CODE_LANGUAGE" content="Visual Basic 7.0">
<meta name="vs_defaultClientScript" content="JavaScript">
<meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
</HEAD>
<body MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="server">
<FONT face="宋体">
<asp:DataList id="DataList1" DataKeyField="CustomerID" runat="server">
<ItemTemplate>
<table width="100%">
<tr>
<td>编号:<%# Container.DataItem("CustomerID")%></td>
<td>名称:<%# Container.DataItem("CompanyName")%></td>
</tr>
</table>
<asp:DataGrid id="DataGrid1" AutoGenerateColumns="False" runat="server">
<Columns>
<asp:BoundColumn DataField="OrderID" HeaderText="订单编号"></asp:BoundColumn>
<asp:BoundColumn DataField="CustomerID" HeaderText="顾客编号"></asp:BoundColumn>
</Columns>
</asp:DataGrid>
</ItemTemplate>
</asp:DataList>
</FONT>
</form>
</body>
</HTML>
xrll 2003-08-21
  • 打赏
  • 举报
回复
你的mail,动态动态添加效果:http://218.84.107.5/g.aspx
luckysusan 2003-08-21
  • 打赏
  • 举报
回复
你在datagrid里面有加 EditCommandColumn 吗?
只有加了这个,然后在点编辑时

DataGrid1.EditItemIndex才会有对应选中行的索引的! 否则是-1!

你调试一下便知!
stuhome 2003-08-21
  • 打赏
  • 举报
回复
估计你的DataGrid的绑定事件没有放在
if(!Page.IsPostBack)
{}里面。
建议:将DataGrid的绑定事件写为一个函数。
然后每次执行EditCommand或UpdateCommand的时候再调用这个绑定函数。
那么你的DropDownList如果还找不到,我就不信了

下面一段是我的程序
////////////////user_admin.aspx//////////////////
…………
<asp:DataGrid id="DataGrid_usr" runat="server" Width="100%" PageSize="20" BorderWidth="0px" CellSpacing="2"
CellPadding="3" OnEditCommand="DataGrid_EditCommand" OnDeleteCommand="DataGrid_DeleteCommand"
AutoGenerateColumns="False" AllowPaging="True" OnPageIndexChanged="DataGrid_PageIndexChanged"
OnItemCreated="DataGrid_ItemCreated" OnUpdateCommand="DataGrid_UpdateCommand" OnCancelCommand="DataGrid_CancleCommand">
<AlternatingItemStyle BackColor="#D2E6FB"></AlternatingItemStyle>
<ItemStyle BackColor="#D2E6FB"></ItemStyle>
<HeaderStyle BackColor="#63A5E7"></HeaderStyle>
<Columns>
<asp:TemplateColumn>
<HeaderStyle Font-Bold="True" HorizontalAlign="Center" Width="5%"></HeaderStyle>
<ItemStyle HorizontalAlign="Center"></ItemStyle>
<HeaderTemplate>
编号
</HeaderTemplate>
<ItemTemplate>
<%# DataBinder.Eval(Container.DataItem,"id")%>
</ItemTemplate>
<EditItemTemplate>
<asp:Label ID="Label_usr_id" Runat=server Text='<%# DataBinder.Eval(Container.DataItem,"id")%>'>
</asp:Label>
</EditItemTemplate>
</asp:TemplateColumn>
<asp:TemplateColumn>
<HeaderStyle Font-Bold="True" HorizontalAlign="Center" Width="12%"></HeaderStyle>
<HeaderTemplate>
昵称
</HeaderTemplate>
<ItemTemplate>
<%# DataBinder.Eval(Container.DataItem,"nick_name")%>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="usr_nick_name" MaxLength=20 Columns=10 Runat="server" Enabled="True" Text='<%# DataBinder.Eval(Container.DataItem,"nick_name")%>'>
</asp:TextBox>
</EditItemTemplate>
</asp:TemplateColumn>
<asp:TemplateColumn>
<HeaderStyle Font-Bold="True" HorizontalAlign="Center" Width="12%"></HeaderStyle>
<HeaderTemplate>
真实姓名
</HeaderTemplate>
<ItemTemplate>
<%# DataBinder.Eval(Container.DataItem,"real_name")%>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="usr_real_name" MaxLength=12 Columns=10 Runat="server" Enabled="True" Text='<%# DataBinder.Eval(Container.DataItem,"real_name")%>'>
</asp:TextBox>
</EditItemTemplate>
</asp:TemplateColumn>
<asp:TemplateColumn>
<HeaderStyle Font-Bold="True" HorizontalAlign="Center" Width="16%"></HeaderStyle>
<HeaderTemplate>
用户类型
</HeaderTemplate>
<ItemTemplate>
<%# DataBinder.Eval(Container.DataItem,"kind_name")%>
</ItemTemplate>
<EditItemTemplate>
<asp:DropDownList ID="Dropdownlist_usr_kind" Runat="server" Enabled="True" SelectedIndex='<%# DataBinder.Eval(Container.DataItem,"kind")%>'>
<asp:ListItem Value="1">领导</asp:ListItem>
<asp:ListItem Value="2">教师</asp:ListItem>
<asp:ListItem Value="3">领导、教师</asp:ListItem>
<asp:ListItem Value="4">学生</asp:ListItem>
<asp:ListItem Value="5">注册用户</asp:ListItem>
</asp:DropDownList>
</EditItemTemplate>
</asp:TemplateColumn>
…………
//////////////////////user_admin.aspx.cs////////////////////////
…………
private void Page_Load(object sender, System.EventArgs e)
{
if(!Page.IsPostBack)
{
join_fun();
}
}
…………

public void DataGrid_UpdateCommand(object seder,DataGridCommandEventArgs e)
{
Label lb;
TextBox tb,tb1;
DropDownList dp,dp1;
lb=(Label)e.Item.FindControl("Label_usr_id");
tb=(TextBox)e.Item.FindControl("usr_real_name");
tb1=(TextBox)e.Item.FindControl("usr_nick_name");
dp=(DropDownList)e.Item.FindControl("Dropdownlist_usr_kind");
dp1=(DropDownList)e.Item.FindControl("Dropdownlist_usr_power");
bool nick_chk=nick_right_chk(tb1.Text.Trim());
if(!nick_chk)
{
Response.Write("<script>window.alert('昵称以字母开头,长度为3-20位且只能由字母、数字或下划线组成!');</script>");
return;
}
…………

lionzhf 2003-08-21
  • 打赏
  • 举报
回复
<asp:TemplateColumn HeaderText="drplist">
<ItemTemplate>
<asp:DropDownList id=dr_data runat="server" DataSource="<%# bindDrop()%>" DataTextField="keyvalue" DataValueField="keyvalue">
</asp:DropDownList>
</ItemTemplate>
</asp:TemplateColumn>
上面是前台代码
下面是后台函数
public DataSet bindDrop()
{
RepeatServer.Service1 server=new RepeatServer.Service1();
DataSet ds=server.ShowDropData();
return ds;

}
这样绑定是一种方式
还有一种方式是在ItemBond()里面
FIRSTVIP 2003-08-21
  • 打赏
  • 举报
回复
DataGrid1.EditItemIndex 获得编辑行

我想也是找不到DropDownList4,但不知怎么解决。
einsteincao 2003-08-21
  • 打赏
  • 举报
回复
如果放在EditItemTemplate中也可以找到,需要在OnEditCommand中FindControl 一定可以找得到!!
acewang 2003-08-21
  • 打赏
  • 举报
回复
为什么要在按钮里实现,

要是编辑行在itembound里面绑定dropdownlist多方便
加载更多回复(3)

62,041

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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