2014-06-09 73 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;