2014-06-09 108 views
1

我有一個表單,其中包含將數據插入到datagridview的文本框。當我輸入數據時,它成功地將它輸入到datagridview中,這很好。但是,如果我在不輸入數據的情況下關閉表單,則會在datagridview中插入一個空白行,然後在其下面啓動一個新行以準備接收更多數據。我怎樣才能防止它插入空行?防止將空白datarow插入到datagridview

public partial class newquoteForm : Form 
{ 
    public newquoteForm() 
    { 
     InitializeComponent(); 
    } 
    DataTable dt = new DataTable(); 
    public void newquoteForm_Load(object sender, EventArgs e) 
    { 
     DataRow dr; 
     dt.Columns.Add("Item Name"); 
     dt.Columns.Add("Item Description"); 
     dt.Columns.Add("Retail Price"); 
     dt.Columns.Add("Cost Price"); 
     dt.Columns.Add("In Stock"); 
     dt.Columns.Add("On Jobs"); 
     dr = dt.NewRow(); 
     dataGridView1.DataSource = dt;  
    } 

    public void addBTN_Click(object sender, EventArgs e) 
    { 
     additemForm additemForm = new additemForm(); 
     additemForm.ShowDialog(); 
     dt.Rows.Add(additemForm.strItem, additemForm.strDesc, additemForm.strRetail); // some methods are missing, Don't worry about it. 
     dataGridView1.DataSource = dt; 
    } 
} 
+1

你可以把斷點上的OnClose或OnClosing事件看看是否有其他代碼正在執行,會導致這也可能要設置dataGridView1.DataSource = null;在形式關閉事件.. – MethodMan

回答

1

它看起來像你的AddItemForm有你使用的時候創建一個新的行addBTN_Click執行某些屬性。您從不檢查AddItemForm是否正確初始化這些屬性。即使這些值爲空,您也可以全部添加這些屬性的值。我會添加一個屬性AddItemFormIsValid只有當其他屬性被正確初始化時纔是真實的。然後在創建新行之前檢查它。

在你AddItemForm:

public bool IsValid { 
    get { 
     return !string.IsNullOrEmpty(txtStrItem.Text) && 
       !string.isNullOrEmpty(your other textboxes)...; 
     // I'm just guessing here what controls your form has. you should see the point though 
    } 
} 

然後當你創建新的行:

using (var addItemForm = new AddItemForm()) { 
    if (addItemForm.ShowDialog() == DialogResult.OK) { 
     if (addItemForm.IsValid) { 
      dt.Rows.Add(additemForm.strItem, additemForm.strDesc, additemForm.strRetail); 
     } 
    } 
}  
+0

完美的作品與你做了一個小錯誤(addItemForm.IsValid())像一個方法使用,沒有問題只是刪除(),它的工作原理。 – Tom

+0

哦,很好。我也編輯它使用'using'語句來確保它被正確處置。 –

+0

如在,我打開窗體,關閉它,並重新打開沒有錯誤信息「無法恢復處置對象」(或不管它是什麼!) – Tom

0

說我已經創建了一個additemForm形式三個文本框,然後設置strItem,strDesc和strRetail屬性關閉窗體。我還將設置對話框結果,那麼:

void additemForm_Closing(object sender, CancelEventArgs e) 
    { 
     strItem = this.textBox1.Text; 
     strDesc = this.textBox2.Text; 
     strRetail = this.textBox3.Text; 

     //You can check anything here 
     if (string.IsNullOrEmpty(strItem)) 
     { 
      this.DialogResult = DialogResult.Cancel; 
     } 
     else 
     { 
      this.DialogResult = DialogResult.OK; 
     } 
    } 

現在的主要形式,你可以檢查對話結果,然後採取行動就可以了:

additemForm additemForm = new additemForm(); 
     DialogResult dialogResult = additemForm.ShowDialog(); 
     if (dialogResult == DialogResult.Cancel) 
     { 
      return; 
     } 
     dt.Rows.Add(additemForm.strItem, additemForm.strDesc, additemForm.strRetail); // some methods are missing, Don't worry about it. 
     dataGridView1.DataSource = dt;