在listview中访问文本框时遇到问题

时间:2014-07-29 18:33:32

标签: c# asp.net listview

每次单击lnkUpdate按钮时,我都会收到错误("输入字符串格式不正确")我错过了什么吗?我无法找到更新事件中代码的错误

ASPX

<table class="table table-bordered table-hover table-responsive">
    <thead>
        <tr>
            <th>Product ID</th>
            <th>Product Name</th>
            <th>Received</th>
            <th>Remaining</th>
            <th>Ordered</th>
            <th></th>
        </tr>    
    </thead>
    <tbody>
        <asp:ListView ID="lvSODetails" runat="server" 
            onitemcanceling="lvSODetails_ItemCanceling" 
            onitemediting="lvSODetails_ItemEditing" 
            onitemupdating="lvSODetails_ItemUpdating" >
            <ItemTemplate>
                <tr>
                    <td><%# Eval("ProductID") %></td>
                    <td><%# Eval("ProductName") %></td>
                    <td><%# Eval("Received") %></td>
                    <td><%# Eval("Remaining")%></td>
                    <td><%# Eval("Quantity") %></td>
                    <td>
                        <asp:LinkButton ID="lnkEdit" runat="server" 
                        class="glyphicon glyphicon-pencil" CommandName="Edit" />
                    </td>
                </tr>
            </ItemTemplate>
            <EditItemTemplate>
                <asp:Panel ID="pnlDetails" runat="server" DefaultButton="lnkUpdate">
                    <tr>
                        <td><asp:Label ID="lblID" runat="server" Text='<%# Eval("ProductID") %>' /></td>
                        <td><%# Eval("ProductName") %></td>
                        <td><asp:TextBox ID="txtQtyReceived" runat="server" /></td>
                        <td><asp:Label ID="lblRemaining" runat="server" Text='<%# Eval("Remaining") %>' /></td>
                        <td><%# Eval("Quantity") %></td>
                        <td>
                            <asp:LinkButton ID="lnkUpdate" runat="server" 
                            class="glyphicon glyphicon-ok" CommandName="Update" />
                            <asp:LinkButton ID="lnkCancel" runat="server" 
                            class="glyphicon glyphicon-remove" CommandName="Cancel" />
                        </td>
                    </tr>
                </asp:Panel>
            </EditItemTemplate>
        </asp:ListView>
    </tbody>
</table>

c#c​​ode

protected void lvSODetails_ItemEditing(object sender, ListViewEditEventArgs e)
{
    lvSODetails.EditIndex = e.NewEditIndex;
    GetInfo();
    GetDetails();
}
protected void lvSODetails_ItemCanceling(object sender, ListViewCancelEventArgs e)
{
    lvSODetails.EditIndex = -1;
    GetInfo();
    GetDetails();
}
protected void lvSODetails_ItemUpdating(object sender, ListViewUpdateEventArgs e)
{
    string ProdID = (lvSODetails.Items[e.ItemIndex].FindControl("lblID") as Label).Text;
    string Received = (lvSODetails.Items[e.ItemIndex].FindControl("txtQtyReceived") as TextBox).Text;
    string Remaining = (lvSODetails.Items[e.ItemIndex].FindControl("lblRemaining") as Label).Text;
    if (int.Parse(Received) < 0) //   <~ this is where the code stops (error"input string was not in a correct format")
    {
        error.Visible = true;
        lblError.Text = "Items received must not be lower than zero";
    }
    else if (int.Parse(Received) >= 0 && int.Parse(Received) <= int.Parse(Remaining))
    {
        SODetails = (DataTable)Session["sodelivery"];
        foreach (DataRow row in SODetails.Rows)
        {
            if (row["ProductID"].ToString() == ProdID)
            {
                row["Received"] = Received;
                break;
            }
        }
    }
    lvSODetails.EditIndex = -1;
    GetInfo();
    GetDetails();
}

~~~~编辑~~~~

listview数据绑定代码

void GetDetails()
    {
        if (SODetails == null)
        {
            con.Open();
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = con;
            cmd.CommandText = "SELECT sod.ProductID, p.ProductName, sod.SOQtyReceived AS Received, " +
                "(sod.SOQtyOrdered - sod.SOQtyReceived) AS Remaining, sod.SOQtyOrdered AS Quantity FROM SODetails AS sod " +
                "INNER JOIN Products AS p ON sod.ProductID=p.ProductID WHERE sod.SONo=@SONo";
            cmd.Parameters.Add("@SONo", SqlDbType.Int).Value = Request.QueryString["ID"].ToString();
            SqlDataAdapter data = new SqlDataAdapter(cmd);
            SODetails = new DataTable();
            data.Fill(SODetails);

            DataRow[] rowList = SODetails.Select();
            foreach (DataRow dr in rowList)
            {
                dr["Received"] = "0";
            }
            lvSODetails.DataSource = SODetails;
            lvSODetails.DataBind();
            con.Close();
            Session["sodelivery"] = SODetails;
        }
        else
        {
            lvSODetails.DataSource = SODetails;
            lvSODetails.DataBind();
            Session["sodelivery"] = SODetails;
        }
    }

1 个答案:

答案 0 :(得分:-1)

您的问题不在于您无法访问TextBox。

使用int.TryParse代替int.Parse,因为您正在阅读用户输入。

        int received;
        if (!int.TryParse(Received, out received) || received < 0)
        {
                error.Visible = true;
                lblError.Text = "Items received must not be lower than zero";
        }