【问题标题】:ASP.NET GridView Not Displaying DropDownListASP.NET GridView 不显示下拉列表
【发布时间】:2021-08-21 17:25:57
【问题描述】:

我有一个 ASP.NET Web 应用程序,它连接到 SQL 数据库并在一个页面上填充多个网格视图,显示不同的数据集。其中两列是下拉列表,因为我希望用户能够选择不同的(类别和状态)。我可以让数据显示的唯一方法是,如果我像这样在 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>

我想做的是从数据库中提取状态并使用

在我的gridview中显示它们
OnRowDataBound="OnRowDataBound"

将数据库中的数据拉入下拉列表,如下所示:

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");
    }
}

但是,当我尝试实现 OnRowDataBound 并像这样更改我的 gridview 时,这不起作用,并且根本没有数据显示在我的 gridview 中:

<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>

任何人都可以建议上述方法是否是我的方案的最佳做法,如果是,代码可能有什么问题导致我的数据不显示?

【问题讨论】:

    标签: c# asp.net gridview


    【解决方案1】:

    好的,因为每行都有一个下拉菜单?两个问题: 一、必须在item数据绑定事件中填写。 第二,您还必须将值设置为正确的值。

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

    并让我们能够在每一行上进行选项卡,编辑值,然后有一个保存按钮。您可以转储保存按钮,但假设我们在该网格视图中有一个城市下拉列表。所以我们有了这个标记(城市将是下拉列表)。

    所以,我们的标记是这样的:

    <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>
    

    好的,所以输出如下所示:

    因此,您可以使用标签 - 进行更改。然后一个保存按钮会将所有更改写回数据库。

    您可以删除数据库保存按钮代码 - 但无论如何代码并不多。

    而且我确实保留了表格 - 刚刚保存了代码。如前所述,如果您不想编辑(转储视图状态代码),则可以删除表的持久化。

    至于城市组合框?我只加载一次城市表 - 并且只在第一页加载时 - 它在表单级别持续足够长的时间,以便项目数据绑定代码工作。

    绑定组合框的代码还添加了一个空白行 - 因为我想允许空白选择。

    代码是这样的:

        DataTable MyTable = new DataTable();
        DataTable MyCity = new DataTable();
    
        protected void Page_Load(object sender, EventArgs e)
        {
            if (IsPostBack == false)
            {
                LoadGrid();
                ViewState["MyTable"] = MyTable;
            }
            else
                    MyTable = (DataTable)ViewState["MyTable"];
        }
    
        public void LoadGrid()
        {
            using (SqlCommand cmdSQL = new SqlCommand("SELECT City from tblCity ORDER BY City",
                new SqlConnection(Properties.Settings.Default.TEST3)))
            {
                cmdSQL.Connection.Open();
                MyCity.Load(cmdSQL.ExecuteReader());
    
    
                cmdSQL.CommandText = "SELECT * from tblHotels ORDER BY HotelName";
                MyTable.Load(cmdSQL.ExecuteReader());
                MyGrid.DataSource = MyTable;
                MyGrid.DataBind();
    
            }
        }
    
        protected void MyGrid_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                DropDownList mydrop = (DropDownList)e.Row.FindControl("CityDrop");
                mydrop.DataSource = MyCity;
                mydrop.DataBind();
                mydrop.Items.Insert(0, new ListItem(string.Empty));     // add blank row
                                                                        // set drop down list to row value (use table to get this value)
                
                mydrop.Text = MyTable.Rows[e.Row.RowIndex]["City"].ToString();
            }
        }
    
        protected void cmdSave_Click(object sender, EventArgs e)
        {
            // move data from grid to table
            foreach (GridViewRow MyRowG in MyGrid.Rows)
            {
                DataRow OneRow = MyTable.Rows[MyRowG.RowIndex];
                TextBox tt;
                
                OneRow["FirstName"] = ((TextBox)MyRowG.FindControl("FirstName")).Text;
                OneRow["lastName"] = ((TextBox)MyRowG.FindControl("LastName")).Text;
                OneRow["HotelName"] = ((TextBox)MyRowG.FindControl("HotelName")).Text;
                OneRow["City"] = ((DropDownList)MyRowG.FindControl("CityDrop")).Text;
                OneRow["Province"] = ((TextBox)MyRowG.FindControl("Province")).Text;
            }
    
            // table now loaded - save back to databsse
            using (SqlCommand cmdSQL = new SqlCommand("SELECT * from tblHotels WHERE ID = 0",
                                       new SqlConnection(Properties.Settings.Default.TEST3)))
            {
                SqlDataAdapter da = new SqlDataAdapter(cmdSQL);
                SqlCommandBuilder daUpdate = new SqlCommandBuilder(da);
    
                da.Update(MyTable);
            }
        }
    }
    

    因此,您必须为每一行加载每个下拉列表,然后将该下拉列表的值设置为正确的值(您必须同时执行这两项操作)。

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

    【讨论】:

    • 感谢您的回答。我在 MyGrid_RowDataBound 函数上遇到错误:运算符“==”不能应用于“System.Web.UI.WebControls.DataControlRowType”和“System.Web.UI.WebControls.ListItemType”类型的操作数 - 有没有需要额外的导入才能工作?
    • 对不起 - 该代码有一些错误 - 它是一些 vb 代码 - 通过 vb 到 c# 翻译器发送它,它弄得一团糟。我只是将代码剪切 + 粘贴到 C# 中 - 清理它 - 现在看看代码 - 它应该可以工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-05
    • 1970-01-01
    • 2014-01-12
    • 1970-01-01
    相关资源
    最近更新 更多