C# ASP.NET GridView未显示DropDownList

C# ASP.NET GridView未显示DropDownList,c#,asp.net,gridview,C#,Asp.net,Gridview,我有一个ASP.NET web应用程序,它连接到SQL数据库,并在一个页面上填充多个GridView,显示不同的数据集。其中两列是下拉列表,因为我希望用户能够选择不同的(类别和状态)。获取要显示的数据的唯一方法是在gridview中硬编码类别和状态名称,如下所示: <asp:TemplateField SortExpression="rank" Visible="true" HeaderText="Area" > &

我有一个ASP.NET web应用程序,它连接到SQL数据库,并在一个页面上填充多个GridView,显示不同的数据集。其中两列是下拉列表,因为我希望用户能够选择不同的(类别和状态)。获取要显示的数据的唯一方法是在gridview中硬编码类别和状态名称,如下所示:

<asp:TemplateField SortExpression="rank" Visible="true" HeaderText="Area" >
    <HeaderStyle HorizontalAlign="Left" CssClass="col_med" />
    <ItemTemplate>
    <asp:DropDownList id="ddlRank" AutoPostBack="True" OnSelectedIndexChanged="Rank_Change" runat="server" CssClass="col_med" 
    SelectedValue='<%# Eval("rank") %>' TabIndex='<%# TabIndex %>'>
        <asp:ListItem Value=""> - </asp:ListItem>
        <asp:ListItem Value="1"> 1</asp:ListItem>
        <asp:ListItem Value="2"> 2</asp:ListItem>
        <asp:ListItem Value="3"> 3</asp:ListItem>
        <asp:ListItem Value="4"> 4</asp:ListItem>
        <asp:ListItem Value="5"> 5</asp:ListItem>
        <asp:ListItem Value="6"> 6</asp:ListItem>
    </asp:DropDownList>
    </ItemTemplate>
</asp:TemplateField>
protected void OnRowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        //Find the DropDownList in the Row
        DataTable ddLine = DAL.listLine();
        ddLine = resort(ddLine, "line", "desc");
        //Find the DropDownList in the Row
        DataTable ddlArea = DAL.listArea();
        ddlArea = resort(ddlArea, "area", "desc");
    }
}
<asp:BoundField HeaderText="Area" DataField="rank" />
    <asp:TemplateField HeaderText = "Area">
        <ItemTemplate>
            <asp:Label ID="lblArea" runat="server" Text='<%# Eval("rank") %>' Visible = "false" />
            <asp:DropDownList ID="ddlArea" runat="server">
            </asp:DropDownList>
        </ItemTemplate>
    </asp:TemplateField>
将数据从数据库拉入DropDownList,如下所示:

<asp:TemplateField SortExpression="rank" Visible="true" HeaderText="Area" >
    <HeaderStyle HorizontalAlign="Left" CssClass="col_med" />
    <ItemTemplate>
    <asp:DropDownList id="ddlRank" AutoPostBack="True" OnSelectedIndexChanged="Rank_Change" runat="server" CssClass="col_med" 
    SelectedValue='<%# Eval("rank") %>' TabIndex='<%# TabIndex %>'>
        <asp:ListItem Value=""> - </asp:ListItem>
        <asp:ListItem Value="1"> 1</asp:ListItem>
        <asp:ListItem Value="2"> 2</asp:ListItem>
        <asp:ListItem Value="3"> 3</asp:ListItem>
        <asp:ListItem Value="4"> 4</asp:ListItem>
        <asp:ListItem Value="5"> 5</asp:ListItem>
        <asp:ListItem Value="6"> 6</asp:ListItem>
    </asp:DropDownList>
    </ItemTemplate>
</asp:TemplateField>
protected void OnRowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        //Find the DropDownList in the Row
        DataTable ddLine = DAL.listLine();
        ddLine = resort(ddLine, "line", "desc");
        //Find the DropDownList in the Row
        DataTable ddlArea = DAL.listArea();
        ddlArea = resort(ddlArea, "area", "desc");
    }
}
<asp:BoundField HeaderText="Area" DataField="rank" />
    <asp:TemplateField HeaderText = "Area">
        <ItemTemplate>
            <asp:Label ID="lblArea" runat="server" Text='<%# Eval("rank") %>' Visible = "false" />
            <asp:DropDownList ID="ddlArea" runat="server">
            </asp:DropDownList>
        </ItemTemplate>
    </asp:TemplateField>
但是,当我尝试实现
OnRowDataBound
并像这样更改我的gridview时,这不起作用,在我的gridview中根本没有数据显示:

<asp:TemplateField SortExpression="rank" Visible="true" HeaderText="Area" >
    <HeaderStyle HorizontalAlign="Left" CssClass="col_med" />
    <ItemTemplate>
    <asp:DropDownList id="ddlRank" AutoPostBack="True" OnSelectedIndexChanged="Rank_Change" runat="server" CssClass="col_med" 
    SelectedValue='<%# Eval("rank") %>' TabIndex='<%# TabIndex %>'>
        <asp:ListItem Value=""> - </asp:ListItem>
        <asp:ListItem Value="1"> 1</asp:ListItem>
        <asp:ListItem Value="2"> 2</asp:ListItem>
        <asp:ListItem Value="3"> 3</asp:ListItem>
        <asp:ListItem Value="4"> 4</asp:ListItem>
        <asp:ListItem Value="5"> 5</asp:ListItem>
        <asp:ListItem Value="6"> 6</asp:ListItem>
    </asp:DropDownList>
    </ItemTemplate>
</asp:TemplateField>
protected void OnRowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        //Find the DropDownList in the Row
        DataTable ddLine = DAL.listLine();
        ddLine = resort(ddLine, "line", "desc");
        //Find the DropDownList in the Row
        DataTable ddlArea = DAL.listArea();
        ddlArea = resort(ddlArea, "area", "desc");
    }
}
<asp:BoundField HeaderText="Area" DataField="rank" />
    <asp:TemplateField HeaderText = "Area">
        <ItemTemplate>
            <asp:Label ID="lblArea" runat="server" Text='<%# Eval("rank") %>' Visible = "false" />
            <asp:DropDownList ID="ddlArea" runat="server">
            </asp:DropDownList>
        </ItemTemplate>
    </asp:TemplateField>


有人能告诉我上述方法是否是我的场景的最佳实践吗?如果是的话,导致我的数据不显示的代码可能有什么问题?

好的,因为每行都有一个下拉列表?两个问题: 首先,您必须在item数据绑定事件中填充它。 第二,您还必须将该值设置为正确的值

所以,你需要同时实现这两个目标

让我们来看看在每一行上进行制表,编辑值,然后有一个保存按钮的功能。您可以转储保存按钮,但假设在该gridview中有一个城市下拉列表。所以我们有了这个标记(城市将是下拉列表)

因此,我们的标记是:

<div style="width:40%">

  <asp:GridView ID="MyGrid" runat="server" AutoGenerateColumns="false" CssClass="table table-hover">

    <Columns>
        <asp:TemplateField HeaderText ="First Name">
            <ItemTemplate> <asp:TextBox ID="FirstName" runat="server" Text='<%# Eval("FirstName") %>'></asp:TextBox></ItemTemplate>
        </asp:TemplateField>

        <asp:TemplateField HeaderText ="Last Name">
            <ItemTemplate><asp:TextBox ID="LastName" runat="server" Text='<%# Eval("LastName") %>'></asp:TextBox></ItemTemplate>
        </asp:TemplateField>

        <asp:TemplateField HeaderText ="Hotel Name">
            <ItemTemplate><asp:TextBox ID="HotelName" runat="server" Text='<%# Eval("HotelName") %>'></asp:TextBox></ItemTemplate>
        </asp:TemplateField>


        <asp:TemplateField HeaderText ="City">
            <ItemTemplate>
            <asp:DropDownList  id="CityDrop" runat="server" datatextfield="City" datavaluefield="City" style="height:25px" ></asp:DropDownList>
            </ItemTemplate>
        </asp:TemplateField>

        <asp:Templatefield HeaderText ="Province">
            <ItemTemplate><asp:TextBox ID="Province" runat="server" Text='<%# Eval("Province") %>' ></asp:TextBox></ItemTemplate>
        </asp:Templatefield>
        
    </Columns>

  </asp:GridView>

<asp:Button ID="cmdSave" runat="server" Text="Save Edits" Width="124px" />
</div>
因此,您必须为每一行加载每个下拉列表,然后将该下拉列表的值设置为正确的值(您必须同时执行这两项操作)


如前所述,如果您的目标是不使用用户选项卡,请进行更改-选择下拉列表等?然后,您可以转储保存按钮代码,并转储保存数据表的viewstate代码。

谢谢您的回答。MyGrid_RowDataBound函数出现错误:运算符“==”无法应用于“System.Web.UI.WebControl.DataControls RowType”和“System.Web.UI.WebControl.ListItemType”类型的操作数。是否需要一些额外的导入才能工作?抱歉-该代码有一些错误-是一些vb代码-通过vb将其发送到c#翻译,把事情搞得一团糟。我刚刚将代码剪切并粘贴到C#-清理-现在看看代码-应该可以工作了。