2015-04-21 82 views
1

我试图绑定数据从DataGridView在两个组合框。在组合框中有一个是cbosearchby和其他cbosearchvaluecbosearchby正在工作完美,但是当选择searchvalue错误被抛出时。请帮我理清它。数据绑定DataGridView到组合框投掷空值异常

错误是:

Value cannot be null.Parameter name: value 

这里是我的代码:

private void cboSearchBy_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     cboSearchValue.Items.Clear(); 
     cboSearchValue.Text = ""; 

     if (cboSearchBy.SelectedIndex != -1) 
     { 
      var source = new AutoCompleteStringCollection(); 
      string[] sValues = new string[0]; 

      foreach (DataGridViewRow dr in dataGridView1.Rows) 
      { 
       if (!cboSearchValue.Items.Contains(dr.Cells[cboSearchBy.SelectedItem.ToString()].Value)) 
       { 
        cboSearchValue.Items.Add(dr.Cells[cboSearchBy.SelectedItem.ToString()].Value); 
        Array.Resize(ref sValues, sValues.Length + 1); 
        sValues[sValues.Length - 1] = Convert.ToString(dr.Cells[cboSearchBy.SelectedItem.ToString()].Value); 
       } 
      } 

      source.AddRange(sValues); 
      cboSearchValue.AutoCompleteCustomSource = source; 
     } 
    } 
+0

你在哪个语句中得到上述错误? –

+0

if(!cboSearchValue.Items.Contains(dr.Cells [cboSearchBy.SelectedItem.ToString()] Value)) –

+0

这是给错误 –

回答

1

如果value你传递给Contains()null,那么它会抛出异常。

这里是发生了什么事情在内部,当你调用Contains()方法:

public bool Contains(object value) 
{ 
    return IndexOf(value) != -1; 
} 

public int IndexOf(object value) 
{ 
    if (value == null) 
     throw new ArgumentNullException("value"); 

    return InnerList.IndexOf(value); 
} 

要解决这个问题,你需要单独检查null

var searchValue = dr.Cells[cboSearchBy.SelectedItem.ToString()].Value; 

if (searchValue != null && !cboSearchValue.Items.Contains(searchValue)) 
{ 
    ... 
    ... 
+0

它仍然给出相同的错误 –

+0

我更新了我的答案..有一个错字。再试一次。 –

+0

它不起作用 –

0

这里的问题可能是这个说法:

cboSearchValue.Items.Clear(); 

这叫做imme在你的函数的入口点,这将消除你的下拉列表中的所有项目。而且在你的代码中,你在同一个下拉菜单上使用Contains()。由于下拉菜单已经为空,因此您无法使用Contains(),只需说出您将会收到异常。您可能想要从那里删除该语句。

我不知道你的逻辑究竟是什么,但你可以根据上面提到的事情来尝试。

希望这会有所帮助。

+0

没有它的不工作,如果我没有清除它,我该如何添加新的值。 –

+0

清除后如何检查“Contains()”?显然没有任何价值。条件满足后,您可以清除它,并且您现在已准备好插入新值。就在添加新值的代码之前。 –

+0

但删除它不会改变错误 –