c# - 更新时无法从下拉列表中拉出选定的值/项目

标签 c# asp.net

所以我在 gridview 中有一个下拉列表,我试图从中获取选择值以更新我的数据库。我的问题是:当按下更新按钮时,它会忽略为所选值选择的内容,并获取首次加载下拉列表时设置的第一个值。

所以我的问题是:如何在 gridview 的更新事件期间从下拉列表中获取选定的值。

您将在下面找到我的代码隐藏和 gridview 的标记。

代码隐藏:

    /// <summary>
/// Handles the Click event of the update button under edit in the gridview control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="System.Web.UI.WebControls.GridViewUpdateEventArgs"/> instance containing the event data.</param>
protected void GridViewHolder_Updating(object sender, GridViewUpdateEventArgs e) 
{
    int machineid;
    string machineid1;
    string machineTypeid;
    string machineModelid;

    //retrieve and set the data
    GridViewHolder.EditIndex = e.RowIndex;
    BindData();

    GridViewRow row = (GridViewRow)GridViewHolder.Rows[e.RowIndex];
    TextBox mID = row.FindControl("MachineIDText") as TextBox;
    DropDownList mType = row.FindControl("MachineTypeDropDown") as DropDownList;
    DropDownList mModel = row.FindControl("MachineModelDropDown") as DropDownList;

    machineid1 = mID.Text;
    machineid = Convert.ToInt32(machineid1);
    machineTypeid = mType.SelectedValue;
    machineModelid = mModel.SelectedValue;

    try
    {
        if (machineTypeid != "empty" || machineModelid != "empty")
        {
            if (machineTypeid != "empty")
            {
                inputsService.UpdateMachineTypes(machineid, machineTypeid);
            }
            if (machineModelid != "empty")
            {
                inputsService.UpdateMachineModels(machineid, machineModelid);
            }
            UpdateSucceed.Visible = true;
            logger.Debug("Updating - Database successfully updated!");
        }
        else
        {
            UpdateFail.Visible = true;
            logger.Debug("Updating - Database had no data selected to be updated.");
        }
    }
    catch (Exception ex)
    {
        logger.ErrorFormat("Updating - Failed to update the table, ex = {0}", ex);
    }
}

/// <summary>
/// Handles the Click event of the cancel button under edit in the gridview control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="System.Web.UI.WebControls.GridViewCancelEditEventArgs"/> instance containing the event data.</param>
protected void GridViewHolder_Canceling(object sender, GridViewCancelEditEventArgs e)
{
    //reset the edit index
    GridViewHolder.EditIndex = -1;
    //Bind data to GridViewHolder
    BindData();
}

protected void GridViewHolder_DataBound(object sender, GridViewRowEventArgs e)
{
    if (this.GridViewHolder.EditIndex != -1)
    {
        DropDownList mType = e.Row.FindControl("MachineTypeDropDown") as DropDownList;
        DropDownList mModel = e.Row.FindControl("MachineModelDropDown") as DropDownList;
    }
}

protected void GridViewHolder_Editing(object sender, GridViewEditEventArgs e)
{
    //set the edit index to a new value
    GridViewHolder.EditIndex = e.NewEditIndex;
    //Bind data to gridviewholder
    BindData();
}

#endregion

#region Private Methods

private void BindData()
{
    GridViewHolder.DataSource = Session["MachineTable"];
    GridViewHolder.DataBind();
}

GridView 标记:

<asp:GridView ID="GridViewHolder" 
                      runat="server" 
                      AllowPaging="True" 
                      AutoGenerateColumns="False" 
                      BackColor="Transparent" 
                      BorderColor="#999999" 
                      BorderStyle="Ridge" 
                      BorderWidth="3px" 
                      CellPadding="4" 
                      CellSpacing="2" 
                      DataSourceID="MachineDataSet" 
                      ForeColor="Black" 
                      HeaderStyle-HorizontalAlign="Center" 
                      HorizontalAlign="Center"  
                      RowStyle-HorizontalAlign="Center" 
                      Width="796px"
                      OnRowUpdating="GridViewHolder_Updating"
                      OnRowCancelingEdit="GridViewHolder_Canceling"
                      OnRowEditing="GridViewHolder_Editing"
                      OnRowDataBound="GridViewHolder_DataBound"                          
                      EnableViewState="False">
            <RowStyle BackColor="Transparent" 
                      HorizontalAlign="Center" />
            <Columns>
                <asp:TemplateField HeaderText="ID" 
                                   SortExpression="ID" 
                                   Visible="False">
                    <ItemTemplate>
                        <asp:Label ID="MachineIDLabel" 
                                   runat="server" 
                                   Text='<%# Bind("ID") %>'
                                   Visible="false"></asp:Label>
                    </ItemTemplate>
                    <EditItemTemplate>
                        <asp:TextBox ID="MachineIDText" runat="server" Text='<%# Bind("ID") %>'></asp:TextBox>
                    </EditItemTemplate>
                </asp:TemplateField>
                <asp:BoundField DataField="SiteName" 
                                HeaderText="Site Name" 
                                SortExpression="SiteName"
                                ReadOnly="true" />
                <asp:BoundField DataField="Name" 
                                HeaderText="Machine Name" 
                                ReadOnly="true" 
                                SortExpression="Name" />
                <asp:TemplateField HeaderText="Machine Type" 
                                   SortExpression="MachineType">
                    <ItemTemplate>
                        <asp:Label ID="MachineTypeLabel" 
                                   runat="server" 
                                   Text='<%# Bind("MachineType") %>'>
                        </asp:Label>                            
                    </ItemTemplate>
                    <EditItemTemplate>
                        <asp:DropDownList ID="MachineTypeDropDown" 
                                          runat="server" 
                                          AppendDataBoundItems="True"                                                
                                          Height="21px" 
                                          Width="217px" 
                                          DataSourceID="GetMachineType" 
                                          DataTextField="Name" 
                                          DataValueField="ID">
                            <asp:ListItem Enabled="true" 
                                          Text="Select a Machine Type." 
                                          Value="empty">
                            </asp:ListItem>
                        </asp:DropDownList>
                    </EditItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="Machine Model" SortExpression="MachineModel">
                    <ItemTemplate>
                        <asp:Label ID="MachineModelLabel" 
                                   runat="server" 
                                   Text='<%# Bind("MachineModel") %>'>
                        </asp:Label>                            
                    </ItemTemplate>
                    <EditItemTemplate>
                        <asp:DropDownList ID="MachineModelDropDown" 
                                          runat="server" 
                                          AppendDataBoundItems="True"                                                
                                          Height="21px" Width="217px" 
                                          DataSourceID="GetMachineModel" 
                                          DataTextField="Name" 
                                          DataValueField="ID">
                            <asp:ListItem Enabled="true" 
                                          Text="Select a Machine Model." 
                                          Value="empty">
                            </asp:ListItem>
                        </asp:DropDownList>
                    </EditItemTemplate>
                </asp:TemplateField>
                <asp:CommandField ButtonType="Button" 
                                  ShowEditButton="True"
                                  CausesValidation="false" >
                    <ItemStyle HorizontalAlign="Center" 
                               Wrap="True" />
                </asp:CommandField>
            </Columns>
            <FooterStyle BackColor="Transparent" />
            <PagerStyle BackColor="Transparent" 
                        ForeColor="Black" 
                        HorizontalAlign="Left" />
            <SelectedRowStyle BackColor="Transparent" 
                              Font-Bold="True" 
                              ForeColor="White" />
            <HeaderStyle BackColor="Black" 
                         Font-Bold="True" 
                         ForeColor="White" 
                         HorizontalAlign="Center" />
     </asp:GridView>

非常感谢任何帮助或建议,

谢谢

最佳答案

RowUpdating event具有 GridViewUpdateEventArgs 类型的事件参数。这有键值、旧值和新值的字典。无需使用 GridViewRow 上的 FindControl 来获取它们。

但是您获得旧值的主要原因是您在此事件中再次对其进行数据绑定(bind)。然后,您将使用数据源中的值覆盖所有更改。

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridviewupdateeventargs.aspx

更新:DropDownListSelectedValue 似乎不是NewValues 字典的一部分。因此,您可以将它添加到 RowUpdating 事件中。

protected void GridViewHolder_Updating(object sender, GridViewUpdateEventArgs e) 
{
    GridViewRow row = (GridViewRow)GridViewHolder.Rows[e.RowIndex];
    DropDownList mType = row.FindControl("MachineTypeDropDown") as DropDownList;
    e.NewValues.Add("MachineType", mType.SelectedValue):
}

关于c# - 更新时无法从下拉列表中拉出选定的值/项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8346629/

相关文章:

c# - 如果在页面中声明,则方法不存在

c# - httpModules 不适用于 iis7

c# - 类库中的 app.config - asp.net C#

asp.net - 如何有选择地抑制 Visual Studio 中的标记验证?

c# - 使用类型填充组合框

c# - SignalR 安全消息传递

c# - 类自身内部的实例

c# - 基于表单的身份验证

asp.net - 从 "https://www"重定向到 "https://"

javascript - 使用 C# 的 ASP.net