我一直在玩这个问题几个小时,似乎无法让它发挥作用。
似乎没有搜索行?
private void searchbutton_Click(object sender, EventArgs e)
{
string searchValue = searchtextBox.Text;
int rowIndex = 0;
inkGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
try
{
bool valueResulet = true;
foreach (DataGridViewRow row in inkGridView.Rows)
{
if (row.Cells[rowIndex].Value.ToString().Equals(searchValue))
{
rowIndex = row.Index;
inkGridView.Rows[rowIndex].Selected = true;
rowIndex++;
valueResulet = false;
}
}
if (valueResulet != false)
{
MessageBox.Show("Unable to find "+ searchtextBox.Text,"Not Found");
return;
}
}
catch (Exception exc)
{
MessageBox.Show(exc.Message);
}
}
它总是抛出错误。
答案 0 :(得分:1)
我为我使用的dataGridView创建了一个搜索文本框,所以这对你有用,因为控件非常相似。虽然我选择在找不到它时不给出消息。而不是它将文本框变为红色的消息,它也试图找到完整文本的第一个出现。如果找不到完全匹配,它将尝试查找包含搜索值的匹配
private void searchart()
{
int itemrow = -1;
String searchValue = cueTextBox1.Text.ToUpper();
if (searchValue != null && searchValue != "")
{
foreach (DataGridViewRow row in dataGridView1.Rows)
{
//search for identical art
if (row.Cells[0].Value.ToString().Equals(searchValue))
{
itemrow = row.Index;
break;//stop searching if it's found
}
//search for first art that contains search value
else if (row.Cells[0].Value.ToString().Contains(searchValue) && itemrow == -1)
{
itemrow = row.Index;
}
}
//if nothing found set color red
if (itemrow == -1)
{
cueTextBox1.BackColor = Color.Red;
}
//if found set color white, select the row and go to the row
else
{
cueTextBox1.BackColor = Color.White;
dataGridView1.Rows[itemrow].Selected = true;
dataGridView1.FirstDisplayedScrollingRowIndex = itemrow;
}
}
}
答案 1 :(得分:0)
在我看来,你的if语句就是问题所在。即row.Cells[rowIndex]
返回每行中的Cells,因此命名为rowIndex并在if语句中使用的实际上是列索引。所以你可以改成它,比如说:
if (row.Cells[0].Value.ToString().Equals(searchValue))
搜索第一列。要检查所有Cell列,必须在每行中循环它们。
您可能还想查看rowIndex的使用情况,因为您首先将其分配给0并在循环中启动它。但是,然后你将它分配给
rowIndex = row.Index;
然后继续增加(但只有在找到匹配项时)。我认为你的行和列索引混合在一起/交织在一起。
编辑:我认为抛出的异常是由于没有足够的列,因为你循环遍历单元格(0,0),(1,1),(2,2)......等等而不是循环在带有指定列的行上。
答案 2 :(得分:0)
我会说,除非您将DataGridView.AllowUserToAddRows
设置为false
,否则在尝试访问最后一行的Value.ToString()
时,您将获得空引用异常。因此要么将其设置为false
,要么添加新行,只需添加一个检查
if (row.IsNewRow) continue;