【问题标题】:C# - Find a cell through a textBox in dataGridViewC# - 通过 dataGridView 中的文本框查找单元格
【发布时间】:2017-03-01 01:28:37
【问题描述】:

我已经为我的问题寻找了一些解决方案,但仍然没有找到适合我的方法。所以我注册为我的问题寻求帮助。感谢帮助。

public Form1()
{
    InitializeComponent();
    dataGridView1.Columns.Add("FirstNames", "FirstName");
    dataGridView1.Columns.Add("SecondNames", "SecondName");
    dataGridView1.Columns.Add("AccountNames", "AccountName");
    dataGridView1.Columns.Add("Emailaddresses", "Emailaddress");

    try
    {
        // enter AD settings  
        PrincipalContext AD = new PrincipalContext(ContextType.Domain, (ConfigurationManager.AppSettings["Domaene"]));

        using (var searcher = new PrincipalSearcher(new UserPrincipal(AD)))
        {
            foreach (var result in searcher.FindAll())
            {
                DirectoryEntry de = result.GetUnderlyingObject() as DirectoryEntry;
                dataGridView1.Rows.Add
                (
                    de.Properties["givenName"].Value,
                    de.Properties["sn"].Value,
                    de.Properties["samAccountName"].Value,
                    de.Properties["userPrincipalname"].Value
                );                          
            }
        }
    }    
    catch (Exception ex)
    {
    }
}

这就是我创建 ActiveDirectory 并将其放入 dataGridView 的方式。我正在搜索的功能是如何使用文本框搜索此 DVG。所以我已经尝试过这样的事情:

String searchValue = textBox1.Text;
int rowIndex = -1;

foreach (DataGridViewRow row in dataGridView1.Rows)
{
    if (row.Cells[2].Value != null) // Need to check for null if new row is exposed
    {
        if (row.Cells[1].Value.ToString().Equals(searchValue))
        {
            rowIndex = row.Index;
            break;
        }
    }
}

此 sn-p 来自本网站的另一篇文章。我在我的构建上尝试了它,但它对我不起作用。当我在我的文本框中放一些东西时,它会抛出一个 System.NullReferenceException。问题:我真的不知道为什么它不起作用。 将不胜感激任何答案!

您好, 马文R

【问题讨论】:

  • 它到底在哪里抛出了异常?哪一行?
  • if (row.Cells[1].Value.ToString().Equals(searchValue))
  • 这行检查 null if (row.Cells[2].Value != null) 不应该有 Cells[1] 代替吗?我假设它到达新行并且Cells[1] 没有值,因此不能转换为字符串,因此会引发错误。
  • 如果我让它检查 foor == null 会出现同样的错误。但现在在更改的行中。

标签: c# winforms search datagridview textbox


【解决方案1】:

基本上,您希望枚举所有单元格,并在找到要搜索的值后返回该单元格的行索引。因此,您的代码应该尽可能不提示空引用异常。这种方法的一个例子。

private int SearchValueRowIndex()
{
    string searchValue = textBox1.Text;

    foreach (DataGridViewRow row in dataGridView1.Rows)
    {
        foreach (DataGridViewCell cell in row.Cells)
        {
            if (cell.Value != null && cell.Value.ToString() == searchValue)
            {
                return cell.RowIndex;
            }
        }
    }

    // Not found
    return -1;
}

【讨论】:

  • “返回”出现一些错误。真的不知道如何将这些实施到我的空白中。我想我对此很不满意。
  • 您不能在 void 中返回任何东西。看这个例子的第一行,它返回一个整数private int SearchValueRowIndex()
  • C#中一般有两种方法。一种返回变量作为上面返回整数类型变量的变量,另一种不返回值或 void 方法作为初始方法。根据您的情况,您可以使用其中任何一种。
  • 这就是为什么我在我的代码中寻找一种方法来尝试你的 sn-p,但没有找到。
  • 你可以很方便的将上面的方法修改为不可退货。只需将“int”替换为“void”关键字,像之前一样初始化局部变量“int rowIndex = -1”,最后将“return”关键字替换为“rowIndex =”。
【解决方案2】:

试试这个

    var dg = new DataGrid();
var tb = new TextBox();
tb.ID = "myTextBox"

foreach (DataGridItem item in dg.Items)
{
    foreach (var cell in item.Cells)
    {
        TextBox val = (TextBox)item.FindControl("textboxid here");
        if (val.Text == tb.Text)
        {
            //do something here
        }
    }
}

这将遍历每一行和单元格以在特定文本框中查找值,如果您需要遍历其他文本框,您可以编写另一段代码来查找数据网格中的所有控件。

【讨论】:

  • 感谢您的回答 - 但我需要使用哪个程序集来使用 'ID' 和 'Items' ?抱歉,这里是该死的首发。
  • 您应该可以将其放入您的代码中,只需忽略前 3 行,然后将 dg.Items 重命名为 dataGridView1.Items 其他一切都应该有效。您是否收到编译错误
  • 是的,它告诉我“项目”没有定义。 Even 告诉我,Assemby 有可能失踪了。 dataGridView1.Items 仍然出现编译错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-31
相关资源
最近更新 更多