2015-11-11 5 views
0

Так что я пытаюсь найти некоторую логику. Все плохо.Проблемы с удалением rowindex в dataGridView

Моя проблема, на данный момент, заключается в чтении локального XML-документа в dataGridView. (метод LoadXmlButton_Click)

Вот мой код:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using System.Xml; 

namespace AddProducts_XMLForms 
{ 
    public partial class MainForm : Form 
    { 
     public MainForm() 
     { 
      InitializeComponent(); 
     } 

     public DataTable dst = new DataTable(); 
     Guid id = Guid.NewGuid(); 


     private void Form1_Load(object sender, EventArgs e) 
     { 
      dst.Columns.Add("Artikelnummer", typeof(string)); 
      dst.Columns.Add("Kategori", typeof(string)); 
      dst.Columns.Add("Beskrivning", typeof(string)); 
      dst.Columns.Add("Pris", typeof(decimal)); 
      dst.Columns.Add("Bildadress", typeof(string)); 
     } 

     private void loadXmlButton_Click(object sender, EventArgs e) 
     { 
      try 
      { 
       dst.ReadXml("products.xml"); 
       productsDataGridView.DataSource = dst; 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 
     } 

     private void exportXmlButton_Click(object sender, EventArgs e) 
     { 
      try 
      { 
       dst = (DataTable)productsDataGridView.DataSource; 
       dst.TableName = "Product"; 
       dst.WriteXml("products.xml", true); 
       xmlExportedLabel.Text = "OK"; 
       xmlExportedLabel.ForeColor = Color.Green; 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 
     } 

     private void deleteButton_Click(object sender, EventArgs e) 
     { 
      try 
      { 
       dst.Rows.RemoveAt(productsDataGridView.CurrentCell.RowIndex); 
       productsDataGridView.DataSource = dst; 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 
     } 

     private void addProductButton_Click_1(object sender, EventArgs e) 
     { 
      try 
      { 
       dst.Rows.Add(id.ToString(), categoryCheckListBox.SelectedItem, descriptionTextBox.Text, priceTextBox.Text, imageUrlTextBox.Text); 
       productsDataGridView.DataSource = dst; 

       foreach (int i in categoryCheckListBox.CheckedIndices) 
       { 
        categoryCheckListBox.SetItemCheckState(i, CheckState.Unchecked); 
       } 
       categoryCheckListBox.ClearSelected(); 
       priceTextBox.Clear(); 
       imageUrlTextBox.Clear(); 
       descriptionTextBox.Clear(); 

      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 
     } 

     int i; 
     private void editButton_Click(object sender, EventArgs e) 
     { 
      try 
      { 
       DataGridViewRow row = productsDataGridView.Rows[i]; 
       row.Cells[1].Value = categoryCheckListBox.SelectedItem; 
       row.Cells[2].Value = priceTextBox.Text; 
       row.Cells[3].Value = descriptionTextBox.Text; 
       row.Cells[4].Value = imageUrlTextBox.Text; 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 
     } 
    } 
} 

Он просто не будет загружать продукты в XML и поместить их там, где я хочу их, и я не то, что хорошо при отладке, но пока его кажется, что если переписать код loadXmlButton_Click:

private void loadXmlButton_Click(object sender, EventArgs e) 
     { 
      try 
      { 
       var dt = new DataSet(); 
       dt.ReadXml("products.xml"); 
       productsDataGridView.DataSource = dt.Tables[0]; 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 
     } 

Он теперь будет загружен в DataGridView правильно, но тогда мой метод удаления не будет работать. Возможно, мой метод удаления является основной проблемой? Я смущен!

private void deleteButton_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      dst.Rows.RemoveAt(productsDataGridView.CurrentCell.RowIndex); 
      productsDataGridView.DataSource = dst; 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
    } 
+0

Показать MessageBox в регионе try, чтобы проверить, выполняется ли deleteButton_Click или нет? – Charlie

+0

Можете ли вы указать? У меня есть обработчик исключений для deleteButton_Click, и он выполняется. Исключение: «В индексе нет строки». @Charlie – Awots

+0

Использовать MessageBox (productsDataGridView.Rows.Count); чтобы проверить, содержит ли он какую-либо строку. – Charlie

ответ

0

1) Существует вероятность того, что dst пусто, что вызывает исключение.

2) Вам нужно выбрать ячейку перед запуском события удаления. Ошибка, вероятно, потому, что CurrentCell имеет значение null.

Используйте эту строку, если вы хотите назначить CurrentCell для какого-либо объекта.

DataGridViewCell cell = productsDataGridView[1, 1]; 
    productsDataGridView.CurrentCell = cell; 

Убедитесь, что CurrentCell не имеет значения.

if(dst.Rows.Count>0&&productsDataGridView.CurrentCell!=null) 
{ 
    try 
    { 
     dst.Rows.RemoveAt(productsDataGridView.CurrentCell.RowIndex); 
     productsDataGridView.DataSource = dst; 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 
}