使用Code Behind中的数据在GridView的templatefield中填充DropDownList

时间:2014-07-01 11:15:50

标签: c# asp.net gridview

我已经创建了这个gridview。这是我的代码

protected void OnRowDataBound(object sender, GridViewRowEventArgs e)
{
   if (e.Row.RowType == DataControlRowType.DataRow)
    {
        //Find the DropDownList in the Row
        DropDownList dropdownnop = (e.Row.FindControl("dropdownnop") as DropDownList);
        dropdownnop.DataSource = obj6.Fetchdata("SELECT * from Compliance_Tracker.dbo.paymentNatureMaster where STATUS='1';");
        dropdownnop.DataTextField = "DESC";
        dropdownnop.DataValueField = "DESC";
        dropdownnop.DataBind();



        // Select the payment nature in DropDownList
        string nop = (e.Row.FindControl("NOP") as Label).Text;
        dropdownnop.Items.FindByValue(nop).Selected = true;
    }

这是我的html gridview代码

<asp:GridView ID="GridView1" runat="server" BackColor="White" BorderColor="Black" BorderStyle="Solid" Font-Bold="True" Font-Italic="False" Font-Size="Small" Height="72px" style="margin-left: 41px; margin-top: 108px" Width="783px" DataKeyNames="ID" OnRowEditing="GridView1_RowEditing" OnRowDeleting="GridView1_RowDeleting" OnRowUpdating="GridView1_RowUpdating" OnRowCancelingEdit="GridView1_RowCancelingEdit" AutoGenerateColumns="False" AllowPaging="True" OnPageIndexChanging="GridView1_PageIndexChanging" OnRowDataBound="OnRowDataBound">
        <AlternatingRowStyle BackColor="#FFFFCC" BorderColor="#FF9900" Wrap="False" />
       <Columns>

       <asp:TemplateField HeaderText="TASK ID" SortExpression="TASK ID" HeaderStyle-BackColor="DarkGreen" HeaderStyle-ForeColor="White">
           <ItemTemplate>
               <asp:Label ID="TASKID" runat="server" Text='<%#Eval("[TASK ID]") %>' />
           </ItemTemplate>
       </asp:TemplateField>

       <asp:TemplateField HeaderText="NATURE OF PAYMENT" SortExpression="NATURE OF PAYMENT" HeaderStyle-BackColor="DarkGreen" HeaderStyle-ForeColor="White">
           <ItemTemplate>
               <asp:Label ID="NOP" runat="server" Text='<%#Eval("[NATURE OF PAYMENT]") %>' />
           </ItemTemplate>
           <EditItemTemplate>
               <asp:DropDownList runat="server" ID="dropdownnop"></asp:DropDownList>
           </EditItemTemplate>
       </asp:TemplateField>


        <asp:TemplateField HeaderText="DESC" HeaderStyle-BackColor="DarkGreen" HeaderStyle-ForeColor="White">
          <ItemTemplate>
          <asp:Label runat="server" ID="DESC" Text='<%#Eval("[DESC]") %>'/>
          </ItemTemplate>
          <EditItemTemplate>
         <asp:TextBox ID ="DESC" runat="server" Text='<%#Eval("[DESC]") %>'></asp:TextBox>
         <asp:RequiredFieldValidator ID="REQUIREDFIELDVALIDATORDESC" runat="server" ControlToValidate="DESC" ErrorMessage="FIELD CANNOT BE EMPTY"></asp:RequiredFieldValidator>
          </EditItemTemplate>
        </asp:TemplateField>

        <asp:TemplateField HeaderText="FREQUENCY" HeaderStyle-BackColor="DarkGreen" HeaderStyle-ForeColor="White">
            <ItemTemplate>
                <asp:Label runat="server" ID="FREQUENCY" Text='<%#Eval("FREQUENCY") %>' />
            </ItemTemplate>
            <EditItemTemplate>
                <asp:DropDownList runat="server" ID="dropdownfreq"></asp:DropDownList>
            </EditItemTemplate>
        </asp:TemplateField>

        <asp:TemplateField HeaderText="DUE DATE OF PAYMENT" HeaderStyle-BackColor="DarkGreen" HeaderStyle-ForeColor="White">
            <ItemTemplate>
                <asp:Label runat="server" ID="DDOP" Text='<%#Eval("PREALERT1") %>' />
            </ItemTemplate>
            <EditItemTemplate>
                <asp:DropDownList runat="server" ID="dropdownddop"></asp:DropDownList>
            </EditItemTemplate>
        </asp:TemplateField>

        <asp:TemplateField HeaderText="DUE DATE OF SUBMISSION OF RETURN" HeaderStyle-BackColor="DarkGreen" HeaderStyle-ForeColor="White">
            <ItemTemplate>
                <asp:Label runat="server" ID="DDOSOR" Text='<%#Eval("PREALERT2") %>' />
            </ItemTemplate>
            <EditItemTemplate>
                <asp:DropDownList runat="server" ID="dropdownddosor"></asp:DropDownList>
            </EditItemTemplate>
        </asp:TemplateField>

        <asp:TemplateField HeaderText="OWNER" HeaderStyle-BackColor="DarkGreen" HeaderStyle-ForeColor="White">
            <ItemTemplate>
                <asp:Label runat="server" ID="OWNER" Text='<%#Eval("OWNER") %>' />
            </ItemTemplate>
            <EditItemTemplate>
                <asp:DropDownList runat="server" ID="dropdownowner"></asp:DropDownList>
            </EditItemTemplate>
        </asp:TemplateField>

        <asp:TemplateField HeaderText="VERIFICATION OWNER" HeaderStyle-BackColor="DarkGreen" HeaderStyle-ForeColor="White">
            <ItemTemplate>
                <asp:Label runat="server" ID="VO" Text='<%#Eval("[VERIFICATION OWNER]") %>' />
            </ItemTemplate>
            <EditItemTemplate>
                <asp:DropDownList runat="server" ID="dropdownvo"></asp:DropDownList>
            </EditItemTemplate>
        </asp:TemplateField>

        <asp:TemplateField HeaderText="STATUS" HeaderStyle-BackColor="DarkGreen" HeaderStyle-ForeColor="White">
          <ItemTemplate>
          <asp:Label runat="server" ID="STATUS" Text='<%#Eval("STATUS") %>'/>
          </ItemTemplate>
          <EditItemTemplate>
          <asp:DropDownList runat ="server" ID="dropdownstatus">
              <asp:ListItem Text="Active" Value="1"></asp:ListItem>
              <asp:ListItem Text="Inactive" Value="0"></asp:ListItem>
              </asp:DropDownList>
          </EditItemTemplate>
        </asp:TemplateField>

        <asp:TemplateField Visible="false" HeaderText="ID">
            <ItemTemplate>
            <asp:Label runat="server" ID="ID" Text='<%#Eval("ID") %>' />
            </ItemTemplate>
        </asp:TemplateField>

         <asp:TemplateField HeaderText="Action" HeaderStyle-BackColor="DarkGreen" HeaderStyle-ForeColor="White">
         <ItemTemplate>
         <asp:LinkButton ID="btnEdit" Text="Edit" runat="server" CommandName="Edit" />
         <asp:LinkButton ID="btnDelete" Text="Delete" runat="server" CommandName="Delete" />
         </ItemTemplate>
         <EditItemTemplate>
         <asp:LinkButton ID="btnUpdate" Text="Update" runat="server" CommandName="Update" />
         <asp:LinkButton ID="btnCancel" Text="Cancel" runat="server" CommandName="Cancel" />
         </EditItemTemplate> 
         </asp:TemplateField>
       </Columns>
        <PagerSettings FirstPageText="First" LastPageText="Last" Mode="NumericFirstLast" PageButtonCount="4" />
    </asp:GridView>

所以,我的问题是我能够编辑使用编辑事件,但我无法 填充gridview中的下拉列表,而Iam能够在GridView外部执行相同操作。 这是我的完整代码隐藏

{
Comp obj6 = new Comp();
protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        //populate gridview
        TextBox2.Focus();
        string selectquery = "select [TASK ID],[NATURE OF PAYMENT],[DESC],FREQUENCY,PREALERT1,PREALERT2,OWNER,[VERIFICATION OWNER],(case when STATUS='1' then 'Active' when STATUS='0' then 'Inactive' ELSE 'UNKNOWN' END)as STATUS,ID from Compliance_Tracker.dbo.tasklistManager;";
        obj6.PopulateGrid(GridView1, selectquery);

        {
            // populate dropdownlist for prealert 1
            for (int i = 0; i <= 30; i++)
            {
                DropDownList3.Items.Insert(i, new ListItem((i + 1).ToString(), (i + 1).ToString()));
            }
            DropDownList3.DataBind();
        }
        {
            // populate dropdown list for prealert 2
            for (int j = 0; j <= 30; j++)
            {
                DropDownList4.Items.Insert(j, new ListItem((j + 1).ToString(), (j + 1).ToString()));
            }
            DropDownList4.DataBind();
        }
        {
            //populate dropdown for Nature of Payment
            string query = "select * from Compliance_Tracker.dbo.paymentNatureMaster where STATUS='1';";
            string columnname = "DESC";
            string datavaluefield = "DESC";
            obj6.PopulateCombo(DropDownList1, query, columnname, datavaluefield);
        }
        {
            //populate dropdown for frequency
            string query1 = "select * from Compliance_Tracker.dbo.frequencyMaster where STATUS='1';";
            string columnname1 = "DESC";
            string datavaluefield1 = "DESC";
            obj6.PopulateCombo(DropDownList2, query1, columnname1, datavaluefield1);
        }
        {
            //populate dropdown for owner
            string query2 = "select * from Compliance_Tracker.dbo.ownerMaster where STATUS='1';";
            string columnname2 = "NAME";
            string datavaluefield2 = "NAME";
            obj6.PopulateCombo(DropDownList5, query2, columnname2, datavaluefield2);
        }
        {
            //populate dropdown for owner verification
            string query3 = "select * from Compliance_Tracker.dbo.verificationMaster where STATUS='1'";
            string columnname3 = "NAME";
            string datavaluefield3 = "NAME";
            obj6.PopulateCombo(DropDownList6, query3, columnname3, datavaluefield3);
        }
    }

}
protected void Button1_Click(object sender, EventArgs e)
{
    string query = "insert into Compliance_Tracker.dbo.tasklistManager([NATURE OF PAYMENT],[DESC],FREQUENCY,PREALERT1,PREALERT2,OWNER,[VERIFICATION OWNER],STATUS)values('" + DropDownList1.SelectedItem.Text + "','" + TextBox2.Text + "','" + DropDownList2.SelectedItem.Text + "','" + DropDownList3.SelectedItem.Text + "','" + DropDownList4.SelectedItem.Text + "','" + DropDownList5.SelectedItem.Text + "','" + DropDownList6.SelectedItem.Text + "','" + DropDownList7.SelectedValue + "');";
    obj6.ExecuteScalar(query);
    string selectquery = "select [TASK ID],[NATURE OF PAYMENT],[DESC],FREQUENCY,PREALERT1,PREALERT2,OWNER,[VERIFICATION OWNER],(case when STATUS='1' then 'Active' when STATUS='0' then 'Inactive' ELSE 'UNKNOWN' END)as STATUS,ID from Compliance_Tracker.dbo.tasklistManager;";
    obj6.PopulateGrid(GridView1, selectquery);
    TextBox2.Text = string.Empty;
    DropDownList7.SelectedItem.Text = "Active";
}
protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e) 
{
    GridView1.EditIndex = e.NewEditIndex;
    string selectquery = "select [TASK ID],[NATURE OF PAYMENT],[DESC],FREQUENCY,PREALERT1,PREALERT2,OWNER,[VERIFICATION OWNER],(case when STATUS='1' then 'Active' when STATUS='0' then 'Inactive' ELSE 'UNKNOWN' END)as STATUS,ID from Compliance_Tracker.dbo.tasklistManager;";
    obj6.bind(GridView1, selectquery, "Compliance_Tracker.dbo.tasklistManager");
}
protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
    string ID = GridView1.DataKeys[e.RowIndex].Value.ToString();
    string query = "delete Compliance_Tracker.dbo.tasklistManager where Compliance_Tracker.dbo.tasklistManager.ID = " + ID;
    string populatequery = query + ";select [TASK ID],[NATURE OF PAYMENT],[DESC],FREQUENCY,PREALERT1,PREALERT2,OWNER,[VERIFICATION OWNER],(case when STATUS='1' then 'Active' when STATUS='0' then 'Inactive' ELSE 'UNKNOWN' END)as STATUS,ID from Compliance_Tracker.dbo.tasklistManager;";
    obj6.BindGridData(populatequery, GridView1);
}
protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{

}
protected void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
{
    GridView1.EditIndex = -1;
    string selectquery = "select [TASK ID],[NATURE OF PAYMENT],[DESC],FREQUENCY,PREALERT1,PREALERT2,OWNER,[VERIFICATION OWNER],(case when STATUS='1' then 'Active' when STATUS='0' then 'Inactive' ELSE 'UNKNOWN' END)as STATUS,ID from Compliance_Tracker.dbo.tasklistManager;";
    obj6.bind(GridView1, selectquery, "Compliance_Tracker.dbo.tasklistManager");
}
protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e) 
{
    GridView1.PageIndex = e.NewPageIndex;
    string selectquery = "select [TASK ID],[NATURE OF PAYMENT],[DESC],FREQUENCY,PREALERT1,PREALERT2,OWNER,[VERIFICATION OWNER],(case when STATUS='1' then 'Active' when STATUS='0' then 'Inactive' ELSE 'UNKNOWN' END)as STATUS,ID from Compliance_Tracker.dbo.tasklistManager;";
    obj6.bind(GridView1, selectquery, "Compliance_Tracker.dbo.tasklistManager");
}
protected void OnRowDataBound(object sender, GridViewRowEventArgs e)
{
   if (e.Row.RowType == DataControlRowType.DataRow)
    {
        //Find the DropDownList in the Row
        DropDownList dropdownnop = (e.Row.FindControl("dropdownnop") as DropDownList);
        dropdownnop.DataSource = obj6.Fetchdata("SELECT * from Compliance_Tracker.dbo.paymentNatureMaster where STATUS='1';");
        dropdownnop.DataTextField = "DESC";
        dropdownnop.DataValueField = "DESC";
        dropdownnop.DataBind();



        // Select the payment nature in DropDownList
        string nop = (e.Row.FindControl("NOP") as Label).Text;
        dropdownnop.Items.FindByValue(nop).Selected = true;
    }
}

这里是fetchdata代码

public DataTable Fetchdata(string strSQL)
    {
        SqlDataAdapter DAdpt = new SqlDataAdapter();
        DataSet DSet = new DataSet();
        try
        {
            if (Conn.State == ConnectionState.Closed)
                Conn.Open();
            DAdpt = new SqlDataAdapter(strSQL, Conn);
            DAdpt.Fill(DSet);
            return DSet.Tables[0];
        }
        catch (Exception Ex)
        {
            return null;
            throw new Exception(Ex.Message);
        }
        finally
        {
            DAdpt.Dispose();
            DSet.Dispose();
            Conn.Close();
        }

    }

2 个答案:

答案 0 :(得分:2)

查找控制代码必定存在问题。在下面给出的代码中尝试我使用的那个:

protected void GrdPDataEdit_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        //Replace your find corntrol code with this 
        DropDownList drpnop  = (DropDownList)e.Row.FindControl("dropdownnop");

        if (drpnop != null)
        {
            drpnop.DataSource = obj6.Fetchdata("SELECT * from Compliance_Tracker.dbo.paymentNatureMaster where STATUS='1';");
            drpnop.DataTextField = "DESC";
            drpnop.DataValueField = "DESC";
            drpnop.DataBind();
        }
    }
}

答案 1 :(得分:0)

生成gridview时,无法直接访问GridView内的DropDownList。您需要做的是使用GridView OnRowCreated事件并以这种方式填充下拉列表。我没有任何示例代码,但互联网上有大量的参考资料。

您的大多数代码都可以使用,但您需要移动一些内容。

基本上你需要为OnRowCreated创建一个事件然后 - 这是关键部分 - 使用FindControl方法找到DropDownList并最终将项目插入DDL。

澄清:我认为OnLoad中的代码试图填充DDL,但我没有看到代码框向下滚动。看起来你的代码是可靠的,我认为你只需要从OnRowBinding切换到OnRowCreated