自动填充时,索引超出了数组的范围

时间:2016-02-04 06:45:05

标签: c# asp.net

我有dropdownlistProdID,Namelabel& Quantitytextbox。

DropDownList包含来自我的数据库的数据

&安培;

当selectindexchanged, 它应该填写Namelabel

check image here

当我点击我的下拉列表中的数据

时发生错误

ERROR IMAGE

这是我的代码ASP

 <table >  

<tr>  
     <td>PO#</td> 

   <td>Product#</td>
    <td class="style2">  
        Product Name  
    </td> 

    <td>  
        Quantity  
    </td>  

</tr>  
<tr>  

            <td>
                <asp:Label ID="POID" runat="server" BorderColor="Black" Font-Size="Larger" />
           </td>

           <td>
                <asp:DropDownList ID="ddlProdID" runat="server" class="form-control" 
                    AutoPostBack="True" onselectedindexchanged="ddlProdID_SelectedIndexChanged"></asp:DropDownList>
           </td>

 <td class="style2">   
    <asp:Label ID="Name" runat="server"></asp:Label>
 </td> 


  </td>  

  <td>  
  <asp:TextBox ID="Quantity" runat="server"></asp:TextBox>  
  </td>  

</tr>  
<tr>  
<td class="style3"></td>  
<td class="style2"></td>   
<td>   

</td>  
<td>   
    <asp:Button ID="AddProduct" runat="server" Text="Add Product"   
        BackColor="#999966" onclick="AddProduct_Click" /></td>  
</tr>  

这里是CODE BEHIND

public partial class PODetails : System.Web.UI.Page
{
    SqlConnection con = new SqlConnection(Helper.GetCon());

    protected void Page_Load(object sender, EventArgs e)
    {

        if (!IsPostBack)
        {
            AddProducts();
            GetPO();
            int GetProductID;
            int GetSupplierID;
            LoadOptions();
        }
    }
    protected void LoadOptions()
    {
        con.Open();
        SqlCommand cmd = new SqlCommand();
        cmd.Connection = con;
        cmd.CommandText = "SELECT ProductID FROM Products";

        cmd.Parameters.AddWithValue("@ProductID", ddlProdID.SelectedValue);
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        DataTable Products = new DataTable();
        da.Fill(Products);
        ddlProdID.DataSource = Products;

        ddlProdID.DataTextField = "ProductID";
        ddlProdID.DataValueField = "ProductID";
        ddlProdID.DataBind(); 

    }

    protected void ddlProdID_SelectedIndexChanged(object sender, EventArgs e)
    {
        string ProductID = ddlProdID.SelectedItem.Value;
        con.Open();
        SqlCommand cmd = new SqlCommand();
        cmd.Connection = con;
        cmd.CommandText = "SELECT ProductID FROM Products";
        SqlDataReader dr = cmd.ExecuteReader();
        if (dr.HasRows)
        {
            dr.Read();
            Name.Text = dr.GetString(1);
        }

    }

感谢老兄!请帮助

3 个答案:

答案 0 :(得分:2)

您只读取一个字段,只读取数据库中的一个值。

为什么不使用SqlCommand.ExecuteScalar

要解决此问题,可以更改

Name.Text = dr.GetString(1);

Name.Text = dr.GetString(0);

由于C#使用了基于0的索引。

答案 1 :(得分:0)

问题在于您的查询。您甚至没有从数据库中检索Name并期望显示它。

修复了SelectedIndexChanged事件处理程序中的代码:

cmd.CommandText = "SELECT ProductID, NAME FROM Products WHERE ProductID = @ProductID";  //change column name as you have in database
cmd.Parameters.AddWithValue("@ProductID", ddlProdID.SelectedValue); //get data for specific product
SqlDataReader dr = cmd.ExecuteReader();
if (dr.HasRows)
{
    dr.Read();
    Name.Text = dr.GetString(1);
}

答案 2 :(得分:0)

固定

在@Shaharyar先生的帮助下

protected void ddlProdID_SelectedIndexChanged(object sender, EventArgs e)
{
    string ProductID = ddlProdID.SelectedItem.Value;
    con.Open();
    SqlCommand cmd = new SqlCommand();
    cmd.Connection = con;
    cmd.CommandText = "SELECT ProductID, Name FROM Products WHERE ProductID=@ProductID";
    cmd.Parameters.AddWithValue("@ProductID", ddlProdID.SelectedValue);
    SqlDataReader dr = cmd.ExecuteReader();
    if (dr.HasRows) {
        dr.Read();
        Name.Text = dr.GetString(1);
    }
}

刚刚修复了SelectedIndexChanged

中的代码

谢谢大家