【问题标题】:Gridview EditItemTemplate DropDownList Get SelectedValueGridview EditItemTemplate DropDownList 获取 SelectedValue
【发布时间】:2014-05-21 16:10:10
【问题描述】:

在我的 Gridview 中,我有以下模板字段:

<asp:TemplateField HeaderText="Dept Code" SortExpression="DeptCode">
    <ItemTemplate>
        <%# Eval("DeptCode") %>
    </ItemTemplate>
    <EditItemTemplate>
        <asp:DropDownList ID="ddlDeptCode" runat="server" 
            SelectedValue='<%# Eval("DeptCode") %>' 
            DataSource='<%# GetAllDepartments() %>' 
            DataTextField="DeptCode" 
            DataValueField="DeptCode" />
    </EditItemTemplate>
</asp:TemplateField> 

当我在一行上单击编辑时,这非常有用,它会使用所有值填充 DropDownList 并为该行选择正确的值。

但是,当我尝试更新该行时:OnRowUpdating="UpdateRow"

protected void UpdateRow(object sender, GridViewUpdateEventArgs e)
{
    GridViewRow row = UserGV.Rows[e.RowIndex];
    DropDownList ddl = row.FindControl("ddlDeptCode") as DropDownList;
    string deptCode = ddl.SelectedValue;
}

它找到了 DropDownList 控件,但 SelectedValue 始终为空字符串。
我需要访问所选值以保存到数据库。

关于如何在后面的代码中获取 Gridview 中 DropDownList 的 SelectedValue 的任何想法?

编辑:
您还可以从后面的代码中填充 DropDownList 和 SelectedValue:

protected void gv_RowDataBound(object sender, GridViewRowEventArgs e)
{
     if (e.Row.RowType == DataControlRowType.DataRow)
     {
        if ((e.Row.RowState & DataControlRowState.Edit) > 0)
        {
           var deptMgr = new DepartmentMgr();
           List<Department> departments = deptMgr.GetAllDepartments();
           DropDownList ddList = (DropDownList)e.Row.FindControl("ddlDeptCode");
           ddList.DataSource = departments;
           ddList.DataTextField = "DeptCode";
           ddList.DataValueField = "DeptCode";
           ddList.DataBind();

           string userDeptCode = DataBinder.Eval(e.Row.DataItem, "DeptCode").ToString();
           ddList.SelectedItem.Text = userDeptCode;
           ddList.SelectedValue = userDeptCode;
       }
    }
}

【问题讨论】:

  • 您是从同一个 gridview 表还是另一个表中填充下拉列表?
  • 我明白了,因为我用 xml 创建了一个简单的数据库并创建了两个表,然后完全尝试了您的代码,它工作正常并正确显示值,所以我不确定是什么问题,但我会上传我做的简单项目,也许你能弄清楚。
  • 我仍然怀疑您的问题出在数据库值而不是下拉列表的设计和访问中,无论如何请从这里下载示例:docs.google.com/file/d/0B5Xsv2VzgUv0aHlmaXVrRmVydUE/edit希望对您有所帮助。
  • 好的,等待更新。
  • 是的,你现在知道这个问题真的很奇怪,但很好,至于添加第二个标题的替代方法,我已经在这里使用这种方法codeproject.com/Articles/249155/…,只需复制 RowCreated 和 AddMergedCell方法并修改它们以满足您的需求。我现在得走了,但我希望你能解决这个问题,继续前进,伙计。

标签: c# asp.net gridview selectedvalue edititemtemplate


【解决方案1】:

在编辑模板中,从数据绑定中设置selectedvalue,然后您将获得正确的选定值而不是空值。

 SelectedValue='<%# Bind("DeptCode") %>'

【讨论】:

    【解决方案2】:

    在绑定 gridview 时,我使用了一些技巧来获取表格标题的第二个标题:

    GridViewRow row = new GridViewRow(0, -1, DataControlRowType.Header, DataControlRowState.Normal);
    TableCell th = new TableHeaderCell();
    th.HorizontalAlign = HorizontalAlign.Center;
    th.ColumnSpan = UserGV.Columns.Count;
    th.BackColor = Color.SteelBlue;
    th.ForeColor = Color.White;
    th.Font.Bold = true;
    th.Text = "Manage Users";
    row.Cells.Add(th);
    InnerTable.Rows.AddAt(0, row);
    

    我不完全明白这对获取 DropDownList 控件的 SelectedValue 有何影响,但我一评论它就开始工作了。

    对于那些感兴趣的人,我使用不同的方法获得了第二个标题:

    在 .aspx 文件中,我将其添加到 Gridview:

    OnRowCreated="CreateRow"
    

    并且在后面的代码中我添加了以下方法:

    protected void CreateRow(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.Header)
        {           
            GridView gridView = (GridView)sender;
            GridViewRow row = new GridViewRow(1, 0, DataControlRowType.Header, DataControlRowState.Normal);
            TableCell th = new TableHeaderCell();
            th.HorizontalAlign = HorizontalAlign.Center;
            th.ColumnSpan = UserGV.Columns.Count;
            th.ForeColor = Color.White;
            th.BackColor = Color.SteelBlue;
            th.Font.Bold = true;
            th.Text = "Manage Users";
            row.Cells.Add(th);
    
            gridView.Controls[0].Controls.AddAt(0, row);
        }
    }
    

    现在一切正常。

    【讨论】:

    • 感谢@Baxter 为我节省了时间.. :)
    • 不确定这是否与将来访问此线程的人相关,但我遇到的问题是 GridView(模板字段)的下拉列表(ddl)中的 SelectedIndex 正在恢复为第一个索引(丢失数据库值/选定索引)单击编辑模式时。 @Baxter 在他的问题中的 EDIT 注释/示例代码帮助我意识到,当它应该在 ddl DataBind 之后设置时,我在 ddl datatbind 之前设置了 SelectedIndex。我花了几天的时间试图弄清楚这一点!
    猜你喜欢
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 2013-08-14
    • 1970-01-01
    • 2016-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多