繁体   English   中英

如何在GridView行中添加不同的控件

[英]how to add different control in gridview row

我有一个从列表数据填充的gridview gridview中的每一行都有一个文本框。 gridview有一排我想要一个dropdown控件,而不是textbox 我不知道如何从网格中的一行更改文本框为下拉控件。

我的GridView如下:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false"  style="width:100%;" ShowHeader="false"
                     CellPadding="3" BackColor="White" ForeColor="Black" Font-Bold="false" GridLines="None"
                                    RowStyle-CssClass="GridRow">
    <Columns>
          <asp:TemplateField Visible="false">
               <ItemTemplate>
                   <asp:Label ID="lbl_ItemID" runat="server" Text='<%# Eval("GroupItemTypeID") %>' ></asp:Label>
               </ItemTemplate>
            </asp:TemplateField>
          <asp:TemplateField Visible="false">
               <ItemTemplate>
                   <asp:Label ID="lbl_ItemCode" runat="server" Text='<%# Eval("GroupItemTypeCode") %>' ></asp:Label>
               </ItemTemplate>
          </asp:TemplateField>
        <asp:TemplateField ItemStyle-Width="310px" >
            <ItemTemplate>
                <asp:Label ID="lbl_ItemValuesName" runat="server" Text='<%# Eval("ControlName") %>'  ></asp:Label>
            </ItemTemplate>
         </asp:TemplateField>
        <asp:TemplateField ItemStyle-Width="245px">
            <ItemTemplate>
                <asp:TextBox ID="txtPrice" runat="server"  CssClass="form-control"></asp:TextBox>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField ItemStyle-CssClass="RowWid">
            <ItemTemplate>
                <asp:Label ID="lbl_IsPercentbased" runat="server" Text='<%# Eval("PercentBasedText") %>'></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>

        <asp:TemplateField ItemStyle-Width="70px">
            <ItemTemplate>
                <asp:CheckBox ID="ChkIsPercent" runat="server"  />
            </ItemTemplate>
        </asp:TemplateField>

    </Columns>
</asp:GridView>

后面的代码

private void GetItemValues()
{
    List<Entities.ItemValues> IValues = new List<Entities.ItemValues>();

    IValues = BLL.PriceGroupItemValues.GetAllPriceGroupItemValues();

    GridView1.DataSource = IValues;

    GridView1.DataBind();

}

您可以在这种情况下采用这种方法:

TextBoxDropDown都放在当前TextBox所在的TemplateField中,并在Dropdown中设置Visible=false

现在,在您的代码隐藏中,您可以使用GridView.RowDataBound事件来替代地随时随地显示TextBoxDropdown 像这样的东西:

public void CustomersGridView_RowDataBound(Object sender, GridViewRowEventArgs e)
  {
    if(e.Row.RowType == DataControlRowType.DataRow)
    {
      // set Dropdown visible = true/false as per your requirement.
    }
    else
    {
      // set Textboxvisible = true/false as per your requirement.
    }
  }

此事件将在GridView耳朵排触发,并根据指定的条件,您可以操纵要在该特定排中显示的控件。 您可以找到如下所示的下拉控件:

foreach (GridViewRow row in GridView1.Rows)
{
    categoryName = ((DropDownList)row.FindControl("ddlCategoryName"));
}

希望这可以帮助。

使用占位符控件而不是文本框,并根据您的条件以编程方式向rowdatabound事件中的占位符控件添加文本框或DDL

    <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
                  DataSourceID="SqlDataSource1"
                  DataKeyNames="user_id">
      <Columns>
        <asp:BoundField DataField="user_id" HeaderText="user_id" ReadOnly="True" InsertVisible="False"
                    SortExpression="user_id"></asp:BoundField>
        <asp:BoundField DataField="user_logon" HeaderText="user_logon" SortExpression="user_logon">
                </asp:BoundField>

        <asp:TemplateField>
          <ItemTemplate>
            <asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder>
          </ItemTemplate>
        </asp:TemplateField>
      </Columns>
    </asp:GridView>

样本数据源

'Primary Datasource to bind to the gridview
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString='<%$ ConnectionStrings:SomeConnectionString %>'
    SelectCommand="select top 10 user_id, user_logon from your_user_table"></asp:SqlDataSource>

'Secondary datasource to bind to the ddl
<asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString='<%$ ConnectionStrings:SomeConnectionString %>'
    SelectCommand="select top 5 user_id, user_logon from your_user_table"></asp:SqlDataSource>

后面的代码基于user_id是奇数还是什至放置了一个或另一个控件:

Private Sub GridView1_RowDataBound(sender As Object, e As GridViewRowEventArgs) Handles GridView1.RowDataBound
    If e.Row.RowType = DataControlRowType.DataRow Then
        Dim ph As PlaceHolder = e.Row.FindControl("PlaceHolder1")

        If GridView1.DataKeys(e.Row.RowIndex).Value Mod 2 = 0 Then
            Dim tb As New TextBox()
            tb.Enabled = False
            tb.Text = CType(e.Row.DataItem, DataRowView)("user_logon")
            ph.Controls.Add(tb)
        Else
            Dim ddl As New DropDownList()
            ddl.DataSourceID = SqlDataSource2.ID
            ddl.DataTextField = "user_logon"
            ddl.DataValueField = "user_id"
            ph.Controls.Add(ddl)
            ddl.DataBind()
        End If

    End If
End Sub

根据您的评论进行编辑:

Private Sub GridView1_RowDataBound(sender As Object, e As GridViewRowEventArgs) Handles GridView1.RowDataBound
    If e.Row.RowType = DataControlRowType.DataRow Then
        Dim ph As PlaceHolder = e.Row.FindControl("PlaceHolder1")

        If CType(e.Row.DataItem, DataRowView)("GroupItemTypeID") ="SUBFREQ" Then
            Dim ddl As New DropDownList()
            ddl.DataSourceID = <substitute your requirements>
            ddl.DataTextField = ...
            ddl.DataValueField = ...
            ph.Controls.Add(ddl)
            ddl.DataBind()
        Else
            Dim tb As New TextBox()
            tb.Enabled = ...whatever...
            tb.Text = CType(e.Row.DataItem, DataRowView)("GroupItemTypeID")
            ph.Controls.Add(tb)
        End If

    End If
End Sub

在Harvey提供的解决方案和我现有的代码方面做了一些工作。 在这里发布我的答案。

在gridview中,创建了2个控件,并将一个控件的可见性(下拉列表)设置为false

 <asp:TemplateField ItemStyle-Width="245px">
     <ItemTemplate>
         <asp:TextBox ID="txtPrice" runat="server"  CssClass="form-control"></asp:TextBox>
          <asp:DropDownList ID="ddFrequencyBilling" runat="server" CssClass="form-control" Visible="false"></asp:DropDownList>
    </ItemTemplate>
 </asp:TemplateField>

在gridview的RowDataBound事件中

 if (e.Row.RowType == DataControlRowType.DataRow)
            {
                //foreach( GridViewRow row in GridView1.Rows)
                //{
                    String ItemCode = (e.Row.FindControl("lbl_ItemCode") as Label).Text;

                    if ( ItemCode == "SUBFREQ")
                    {
                        List<Entities.ItemValues> PGItemValues = new List<Entities.ItemValues>();

                        TextBox TextBoxtemp = ((TextBox)e.Row.FindControl("txtPrice"));

                        TextBoxtemp.Visible = false;

                        Label lbel = ((Label)e.Row.FindControl("lbl_IsPercentbased"));

                        lbel.Visible = false;

                        CheckBox chk = ((CheckBox)e.Row.FindControl("ChkIsPercent"));

                        chk.Visible = false;

                        DropDownList dd1 = ((DropDownList)e.Row.FindControl("ddFrequencyBilling"));

                        dd1.Visible = true;

                        PGItemValues = BLL.PriceGroupItemValues.GetItemValueOnCode(ItemCode, 1);

                        dd1.DataSource = PGItemValues;

                        dd1.DataTextField = "IValue";

                        dd1.DataValueField = "ItemCode";

                        dd1.DataBind();
                    }
                //}
            }

是的,它奏效了。 谢谢大家。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM