DropDownList ddl4=(DropDownList)DataGrid1.Items[DataGrid1.EditItemIndex].FindControl("DropDownList4");有问题没有找到DropDownList4!
DataGrid1.EditItemIndex=????

解决方案 »

  1.   

    调试一下:
    应该是说ddl4未实例化FindControl("DropDownList4")应该是找不到DropDownList4
      

  2.   

    把DropDownList放入模板列中的ItemTemplate,这样比较好操作
    不要放到EditItemTemplate,那样找控件比较困难
      

  3.   

    为什么要在按钮里实现,要是编辑行在itembound里面绑定dropdownlist多方便
      

  4.   

    如果放在EditItemTemplate中也可以找到,需要在OnEditCommand中FindControl  一定可以找得到!!
      

  5.   

    DataGrid1.EditItemIndex 获得编辑行我想也是找不到DropDownList4,但不知怎么解决。
      

  6.   

    <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()里面
      

  7.   

    估计你的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;
    }
    …………
      

  8.   

    你在datagrid里面有加 EditCommandColumn 吗?
    只有加了这个,然后在点编辑时DataGrid1.EditItemIndex才会有对应选中行的索引的! 否则是-1!你调试一下便知!
      

  9.   

    你的mail,动态动态添加效果:http://218.84.107.5/g.aspx
      

  10.   

    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>
      

  11.   

    datagrid.items[i].findcontrol() is used to find control in itemtemplate,not in edittemplate.put dropdownlist in itemtemplate,and it'll be ok.
      

  12.   

    do bind the downdroplist at the "datagridbound "
      

  13.   

    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
      

  14.   

    另类的解决方法,把注释也看看,你会解决你的问题的。
    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();
    }
      

  15.   

    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;这样才不会出问题
      

  16.   

    你的问题我模拟了一下,应该是IsPostBack的问题。你改一下。
      

  17.   

    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."
    这种说法简直没有道理。
      

  18.   

    各位兄台,我找到原因了:这样便没问题,有谁来给我解释一下
    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();
      

  19.   

    如果ddl4.DataSource绑定一个数组,也没问题
      

  20.   

    ddl4.DataSource绑定一个数组也没问题。给我解释一下
      

  21.   

    DataSource的数据源必须是一个实现了System.Collections.IEnumerable 接口的对象