2014-01-12 3 views
0

Я работаю, как тестовый проект, для простой системы инвентаризации в ASP.NET. На одной странице я должен сделать страницу для ввода информации о покупке! Я использовал динамическое gridview для облегчения ввода данных. Я использовал this tutorial и this article, но у меня возникла проблема с удалением строки в gridview. Я видел это similar post, но это не помогло.Как удалить строку в динамическом Gridview?

ASPX код, как показано ниже -

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 
<h2> 
    Purchase Management</h2> 
<asp:GridView ID="PurchaseMgmtGridView" runat="server" ShowFooter="True" AutoGenerateColumns="False" 
    CellPadding="4" ForeColor="#333333" GridLines="None" OnRowDeleting="PurchaseMgmtGridView_RowDeleting"> 
    <Columns> 
     <asp:TemplateField HeaderText="Item"> 
      <ItemTemplate> 
       <asp:DropDownList ID="ItemDropDownList" runat="server" AppendDataBoundItems="true"> 
       </asp:DropDownList> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="ItemUnit"> 
      <ItemTemplate> 
       <asp:DropDownList ID="ItemUnitDropDownList" runat="server" AppendDataBoundItems="true"> 
       </asp:DropDownList> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="Rate"> 
      <ItemTemplate> 
       <asp:TextBox ID="RateTextBox" runat="server"> 
       </asp:TextBox> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="Qty."> 
      <ItemTemplate> 
       <asp:TextBox ID="QtyTextBox" runat="server"> 
       </asp:TextBox> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="Total"> 
      <ItemTemplate> 
       <asp:Label ID="TotalLabel" runat="server"> 
       </asp:Label> 
      </ItemTemplate> 
      <FooterStyle HorizontalAlign="Right" /> 
      <FooterTemplate> 
       <asp:Button ID="ButtonAddNewRow" runat="server" Text=" + " OnClick="ButtonAddNewRow_Click" /> 
      </FooterTemplate> 
     </asp:TemplateField> 
     <asp:CommandField ShowDeleteButton="True" /> 
    </Columns> 
</asp:GridView> 
</asp:Content> 

А вот это aspx.cs коды -

namespace SmoothInventoryWeb.Pages.ItemManagment 
{ 
    public class Item 
    { 
     public string Id { get; set; } 
     public string Name{get; set;} 
    } 

    public class ItemUnit 
    { 
     public string Id { get; set; } 
     public string Name{get; set;} 
    } 
    public partial class PurchaseManagementPage : System.Web.UI.Page 
    { 
     public List<Item> GetItemList() 
    { 
     List<Item> itemList = new List<Item>(); 

     itemList.Add(new Item { Id = "1", Name = "Carpet" }); 
     itemList.Add(new Item { Id = "2", Name = "Pasmina Muffler" }); 
     itemList.Add(new Item { Id = "3", Name = "Large Carpet" }); 
     return itemList; 
    } 

    public List<ItemUnit> GetItemUnitList() 
    { 
     List<ItemUnit> itemUnitList = new List<ItemUnit>(); 

     itemUnitList.Add(new ItemUnit { Id = "1", Name = "Pieces" }); 
     itemUnitList.Add(new ItemUnit { Id = "2", Name = "Dorzen" }); 
     itemUnitList.Add(new ItemUnit { Id = "3", Name = "Gross" }); 
     return itemUnitList; 
    } 

    List<Item> itemList = new List<Item>(); 
    List<ItemUnit> itemUnitList = new List<ItemUnit>(); 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     this.itemList = GetItemList(); 
     this.itemUnitList = GetItemUnitList(); 
     if (!Page.IsPostBack) 
      addFirstRowInGridView(); 
    } 

    private void FillItemDropDownList(DropDownList dropDownList) 
    { 
     if (dropDownList == null) 
      return; 
     foreach (Item item in itemList) 
     { 
      dropDownList.Items.Add(new ListItem(item.Name.ToString(), item.Id.ToString())); 
     } 
    } 

    private void FillItemUnitDropDownList(DropDownList dropDownList) 
    { 
     if (dropDownList == null) 
      return; 
     foreach (ItemUnit itemUnit in itemUnitList) 
     { 
      dropDownList.Items.Add(new ListItem(itemUnit.Name.ToString(), itemUnit.Id.ToString())); 
     } 
    } 


    protected void ButtonAddNewRow_Click(object sender, EventArgs e) 
    { 
     AddNewRow(); 
    } 

    private void addFirstRowInGridView() 
    { 
     DataTable dataTable = new DataTable(); 
     dataTable.Columns.Add(new DataColumn("Item", typeof(string))); 
     dataTable.Columns.Add(new DataColumn("ItemUnit", typeof(string))); 
     dataTable.Columns.Add(new DataColumn("Rate", typeof(string))); 
     dataTable.Columns.Add(new DataColumn("Qty", typeof(string))); 
     dataTable.Columns.Add(new DataColumn("Total", typeof(string))); 
     DataRow dataRow = dataTable.NewRow(); 


     dataRow["Item"] = string.Empty; 
     dataRow["ItemUnit"] = string.Empty; 
     dataRow["Rate"] = string.Empty; 
     dataRow["Qty"] = string.Empty; 
     dataRow["Total"] = string.Empty; 
     dataTable.Rows.Add(dataRow); 
     ViewState["CurrentTable"] = dataTable; 

     PurchaseMgmtGridView.DataSource = dataTable; 
     PurchaseMgmtGridView.DataBind(); 

     DropDownList itemDropDownList = 
         (DropDownList)PurchaseMgmtGridView.Rows[0].Cells[0].FindControl("ItemDropDownList"); 
     DropDownList itemUnitDropDownList = 
      (DropDownList)PurchaseMgmtGridView.Rows[0].Cells[1].FindControl("ItemUnitDropDownList"); 
     FillItemDropDownList(itemDropDownList); 
     FillItemUnitDropDownList(itemUnitDropDownList); 


    } 

    private void AddNewRow() 
    { 
     int rowIndex = 0; 

     if (ViewState["CurrentTable"] != null) 
     { 
      DataTable dtCurrentTable = (DataTable)ViewState["CurrentTable"]; 
      DataRow drCurrentRow = null; 
      if (dtCurrentTable.Rows.Count > 0) 
      { 
       for (int i = 1; i <= dtCurrentTable.Rows.Count; i++) 
       { 
        DropDownList itemDropDownList = 
         (DropDownList)PurchaseMgmtGridView.Rows[rowIndex].Cells[0].FindControl("ItemDropDownList"); 
        DropDownList itemUnitDropDownList = 
         (DropDownList)PurchaseMgmtGridView.Rows[rowIndex].Cells[1].FindControl("ItemUnitDropDownList"); 
        TextBox rateTextBox = 
         (TextBox)PurchaseMgmtGridView.Rows[rowIndex].Cells[2].FindControl("RateTextBox"); 
        TextBox qtyTextBox = 
         (TextBox)PurchaseMgmtGridView.Rows[rowIndex].Cells[3].FindControl("QtyTextBox"); 
        Label totalLabel = 
         (Label)PurchaseMgmtGridView.Rows[rowIndex].Cells[4].FindControl("TotalLabel"); 

        drCurrentRow = dtCurrentTable.NewRow(); 


        dtCurrentTable.Rows[i - 1]["Item"] = itemDropDownList.SelectedItem.ToString(); 
        dtCurrentTable.Rows[i - 1]["ItemUnit"] = itemUnitDropDownList.SelectedItem.ToString(); 
        dtCurrentTable.Rows[i - 1]["Rate"] = rateTextBox.Text; 
        dtCurrentTable.Rows[i - 1]["Qty"] = qtyTextBox.Text; 
        dtCurrentTable.Rows[i - 1]["Total"] = totalLabel.Text; 

       } 
       dtCurrentTable.Rows.Add(drCurrentRow); 
       ViewState["CurrentTable"] = dtCurrentTable; 

       PurchaseMgmtGridView.DataSource = dtCurrentTable; 
       PurchaseMgmtGridView.DataBind(); 
      } 
     } 
     else 
     { 
      Response.Write("ViewState is null"); 
     } 
     SetPreviousData(); 
    } 

    private void SetPreviousData() 
    { 
     int rowIndex = 0; 
     if (ViewState["CurrentTable"] != null) 
     { 
      DataTable dt = (DataTable)ViewState["CurrentTable"]; 
      if (dt.Rows.Count > 0) 
      { 
       for (int i = 0; i < dt.Rows.Count; i++) 
       { 
        DropDownList itemDropDownList = 
         (DropDownList)PurchaseMgmtGridView.Rows[rowIndex].Cells[0].FindControl("ItemDropDownList"); 
        DropDownList itemUnitDropDownList = 
         (DropDownList)PurchaseMgmtGridView.Rows[rowIndex].Cells[1].FindControl("ItemUnitDropDownList"); 
        TextBox rateTextBox = 
         (TextBox)PurchaseMgmtGridView.Rows[rowIndex].Cells[2].FindControl("RateTextBox"); 
        TextBox qtyTextBox = 
         (TextBox)PurchaseMgmtGridView.Rows[rowIndex].Cells[3].FindControl("QtyTextBox"); 
        Label totalLabel = 
         (Label)PurchaseMgmtGridView.Rows[rowIndex].Cells[4].FindControl("TotalLabel"); 

        FillItemDropDownList(itemDropDownList); 
        FillItemUnitDropDownList(itemUnitDropDownList); 


        if (i < dt.Rows.Count - 1) 
        { 
         //itemDropDownList.SelectedValue = dt.Rows[i]["Item"].ToString(); 
         //itemUnitDropDownList.SelectedValue = dt.Rows[i]["ItemUnit"].ToString(); 
         itemDropDownList.ClearSelection(); 
         itemDropDownList.Items.FindByText(dt.Rows[i]["Item"].ToString()).Selected = true; 
         itemUnitDropDownList.ClearSelection(); 
         itemUnitDropDownList.Items.FindByText(dt.Rows[i]["ItemUnit"].ToString()).Selected = true; 
        } 

        rateTextBox.Text = dt.Rows[i]["Rate"].ToString(); 
        qtyTextBox.Text = dt.Rows[i]["Qty"].ToString(); 
        totalLabel.Text = dt.Rows[i]["Total"].ToString(); 
        rowIndex++; 
       } 
      } 
     } 
    } 

    protected void PurchaseMgmtGridView_RowDeleting(object sender, GridViewDeleteEventArgs e) 
    { 
     SetRowData(); 
     if (ViewState["CurrentTable"] != null) 
     { 
      DataTable dt = (DataTable)ViewState["CurrentTable"]; 
      DataRow drCurrentRow = null; 
      int rowIndex = Convert.ToInt32(e.RowIndex); 
      if (dt.Rows.Count > 1) 
      { 
       dt.Rows.Remove(dt.Rows[rowIndex]); 
       drCurrentRow = dt.NewRow(); 
       ViewState["CurrentTable"] = dt; 
       PurchaseMgmtGridView.DataSource = dt; 
       PurchaseMgmtGridView.DataBind(); 

       for (int i = 0; i < PurchaseMgmtGridView.Rows.Count - 1; i++) 
       { 
        PurchaseMgmtGridView.Rows[i].Cells[0].Text = Convert.ToString(i + 1); 
       } 
       SetPreviousData(); 
      } 
     } 
    } 
    private void SetRowData() 
    { 
     int rowIndex = 0; 

     if (ViewState["CurrentTable"] != null) 
     { 
      DataTable dtCurrentTable = (DataTable)ViewState["CurrentTable"]; 
      DataRow drCurrentRow = null; 
      if (dtCurrentTable.Rows.Count > 0) 
      { 
       for (int i = 1; i <= dtCurrentTable.Rows.Count; i++) 
       { 
        DropDownList itemUnitDropDownList = 
         (DropDownList)PurchaseMgmtGridView.Rows[rowIndex].Cells[1].FindControl("ItemUnitDropDownList"); 
        DropDownList itemDropDownList = 
         (DropDownList)PurchaseMgmtGridView.Rows[rowIndex].Cells[0].FindControl("ItemDropDownList"); 

        TextBox rateTextBox = 
         (TextBox)PurchaseMgmtGridView.Rows[rowIndex].Cells[2].FindControl("RateTextBox"); 
        TextBox qtyTextBox = 
         (TextBox)PurchaseMgmtGridView.Rows[rowIndex].Cells[3].FindControl("QtyTextBox"); 
        Label totalLabel = 
         (Label)PurchaseMgmtGridView.Rows[rowIndex].Cells[4].FindControl("TotalLabel"); 
        drCurrentRow = dtCurrentTable.NewRow(); 
        //drCurrentRow["RowNumber"] = i + 1; 
        dtCurrentTable.Rows[i - 1]["Item"] = itemDropDownList.SelectedItem.ToString(); 
        dtCurrentTable.Rows[i - 1]["ItemUnit"] = itemUnitDropDownList.SelectedItem.ToString(); 
        dtCurrentTable.Rows[i - 1]["Rate"] = rateTextBox.Text; 
        dtCurrentTable.Rows[i - 1]["Qty"] = qtyTextBox.Text; 
        dtCurrentTable.Rows[i - 1]["Total"] = totalLabel.Text; 
        rowIndex++; 
       } 

       ViewState["CurrentTable"] = dtCurrentTable; 

      } 
     } 
     else 
     { 
      Response.Write("ViewState is null"); 
     } 
    } 
    } 
} 

Эти коды привести что-то вроде этого

enter image description here

Но , как только я начинаю удалять одну из строк, это дает мне это исключение -

enter image description here

Это исключение из метода SetPreviousData() из следующего кода -

DropDownList itemDropDownList = (DropDownList)PurchaseMgmtGridView.Rows[rowIndex].Cells[0].FindControl("ItemDropDownList"); 

Любая идея, где я неправильно?

P.S. : Код Обновлен I [предоставил коды для списка объектов i.e.Item и ItemUnit]

+0

Как вы получаете объект itemDropDownList? – realnero

+0

И опубликуйте этот метод, в котором выдается исключение – realnero

+0

Исключение выбрано из метода SetPreviousData()! Конкретный код: DropDownList itemDropDownList = (DropDownList) PurchaseMgmtGridView.Rows [rowIndex] .Cells [0] .FindControl ("ItemDropDownList"); – Neo182

ответ

2

Это не выглядит, как будто это на самом деле удаление строки в GridView, что это вопрос, а что-то другое.

Во-первых, две вещи отметить - я не могу собрать, потому что не имеют значения для Item и ItemUnit, поэтому я делаю это путем считывания кода. Во-вторых, я еще не закончил свой кофе! (Обновление: мой кофе сделан!)

Похоже, что ссылка на itemDropDownList в SetPreviousData() имеет значение null, так что посмотрите, почему это так. Может быть проще использовать цикл foreach для итерации по строкам этого DataTable, чтобы избежать каких-либо проблем с индексами на основе 0 и сравнением count-1 и т. Д. (Обновление: все равно было бы проще, но это не вызвало проблемы.)

Также не уверен, что вы хотите это сделать, но оператор FindControl для получения ItemDropDownList использует rowIndex, который всегда равен i. (Обновление: опять же, может помочь просто очистить код, но это не является обязательным требованием.)

Начните с выяснения, что такое i, когда он падает и видит, что это то, что вы ожидаете, и выяснить, почему оператор FindControl не является Не работает. Если это 0, возможно, он пытается прочитать строку заголовка или что-то там, где эта раскрывающаяся папка не существует.

Извините, я не могу дать вам окончательное решение, но, надеюсь, это поможет.

Решение: После получения полного кода, это было легче увидеть, что произошло. В принципе, метод PurchaseMgmtGridView_RowDeleting удалял DropdownList из GridView, а затем SetPreviousData() пытался прочитать что-то, чего не было. Оператор FindControl в SetPreviousData возвращал NULL, как указано в сообщении об ошибке, но не по той причине, которую я предположил ранее.

Удалите оскорбительные строки из метода PurchaseMgmtGridView_RowDeleting, и все будет готово.

protected void PurchaseMgmtGridView_RowDeleting(object sender, GridViewDeleteEventArgs e) 
     { 
      SetRowData(); 
      if (ViewState["CurrentTable"] != null) 
      { 
       DataTable dt = (DataTable)ViewState["CurrentTable"]; 
       DataRow drCurrentRow = null; 
       int rowIndex = Convert.ToInt32(e.RowIndex); 
       if (dt.Rows.Count > 1) 
       { 
        dt.Rows.Remove(dt.Rows[rowIndex]); 
        drCurrentRow = dt.NewRow(); 
        ViewState["CurrentTable"] = dt; 
        PurchaseMgmtGridView.DataSource = dt; 
        PurchaseMgmtGridView.DataBind(); 

        // Delete this 
        //for (int i = 0; i < PurchaseMgmtGridView.Rows.Count - 1; i++) 
        //{ 
        // PurchaseMgmtGridView.Rows[i].Cells[0].Text = Convert.ToString(i + 1); 
        //} 
        SetPreviousData(); 
       } 
      } 
     } 
+0

Thanx Dave, вы определили некоторые моменты, о которых нужно подумать! Я подумаю об этих проблемах! Возможно, у меня будет хороший кофе! – Neo182

+0

Нет проблем. Посмотрев на это больше, я думаю, что это может быть строка row 0, которая выглядит так, как будто это, вероятно, строка заголовка в * GridView * (даже если строка 0 DataTable должна/иметь данные). –

+0

не Дэйв, это тоже не помогло! – Neo182

0

Я думаю, вы пытаетесь получить доступ к ссылке на объект, которая указывает на нуль.

Попробуйте как этот

private void SetPreviousData() 
    { 
     if (ViewState["CurrentTable"] != null) 
     { 
      DataTable dt = (DataTable)ViewState["CurrentTable"]; 
      if (dt.Rows.Count > 0) 
      { 
       for (int i = 0; i < dt.Rows.Count-1; i++) 
       { 
        DropDownList itemDropDownList = 
         (DropDownList)PurchaseMgmtGridView.Rows[i].Cells[0].FindControl("ItemDropDownList"); 
        DropDownList itemUnitDropDownList = 
         (DropDownList)PurchaseMgmtGridView.Rows[i].Cells[1].FindControl("ItemUnitDropDownList"); 
        TextBox rateTextBox = 
         (TextBox)PurchaseMgmtGridView.Rows[i].Cells[2].FindControl("RateTextBox"); 
        TextBox qtyTextBox = 
         (TextBox)PurchaseMgmtGridView.Rows[i].Cells[3].FindControl("QtyTextBox"); 
        Label totalLabel = 
         (Label)PurchaseMgmtGridView.Rows[i].Cells[4].FindControl("TotalLabel"); 

        FillItemDropDownList(itemDropDownList); 
        FillItemUnitDropDownList(itemUnitDropDownList); 


        if (i < dt.Rows.Count - 1) 
        { 
         //itemDropDownList.SelectedValue = dt.Rows[i]["Item"].ToString(); 
         //itemUnitDropDownList.SelectedValue = dt.Rows[i]["ItemUnit"].ToString(); 
         itemDropDownList.ClearSelection(); 
         itemDropDownList.Items.FindByText(dt.Rows[i]["Item"].ToString()).Selected = true; 
         itemUnitDropDownList.ClearSelection(); 
         itemUnitDropDownList.Items.FindByText(dt.Rows[i]["ItemUnit"].ToString()).Selected = true; 
        } 

        rateTextBox.Text = dt.Rows[i]["Rate"].ToString(); 
        qtyTextBox.Text = dt.Rows[i]["Qty"].ToString(); 
        totalLabel.Text = dt.Rows[i]["Total"].ToString();       
       } 
      } 
     } 
    } 

См здесь Null Reference Exception

+0

Спасибо Vignesh, Спасибо за мгновенный ответ, но так и не помогли. Ofc ошибка вызвана ссылкой Null Point. но почему он не работает при удалении? в то время как он работал над добавлением строки? – Neo182

+0

Решена ли ваша проблема? если это так, пожалуйста, пометьте полезным для других ссылку –

+0

Еще не решена! Пожалуйста, см. Мой комментарий раньше! – Neo182

Смежные вопросы