【问题标题】:C# Iterate through rows in a DataTableC# 遍历 DataTable 中的行
【发布时间】:2016-02-24 15:37:37
【问题描述】:

我正在尝试遍历 2 列表中的行,以根据名称检查每行中的 1 个字段。一旦找到,我想编写代码将相应的 Number 分配给 OurNumber 变量,并通过将 GotTheNumber 设置为 true 来跳出循环。

下面是我正在使用的代码:

    private void BtnDelete_Click(object sender, EventArgs e)// Sends to ConfirmDeleteEMP Form 
    {            
        ConfirmDeleteEMP form = new ConfirmDeleteEMP();
        DataTable table = new DataTable();
        string connstring = @"Provider = Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\\HoliPlanData.accdb;Persist Security Info=False";
        using (OleDbConnection conn = new OleDbConnection(connstring))
        {
            string query = "SELECT PayrollNo, (FirstName + ' ' + LastName) AS NAME FROM [Employee]";                 
            OleDbDataAdapter adapter = new OleDbDataAdapter(query, conn);
            adapter.Fill(table);                                        
        }

        string SelectedName = DropBoxEmp.Text;            
        bool GotTheNumber = false;
        int OurNumber = 0;
        while (!GotTheNumber)
        {
            foreach (DataRow ThisRow in table.Rows)
            {
                if (SelectedName = (table.Rows[ThisRow])) 
                {
                    OurNumber = ///THATNUMBER///;
                    GotTheNumber = true;
                }  
            }
        }

        MessageBox.Show(SelectedName);
        var GoodNumber = (table.Rows[OurNumber]["PayrollNo"].ToString());
        form.PassValueName = SelectedName;
        form.PassSelectedPayroll = GoodNumber;               
        form.Tag = this;
        form.Show(this);
        Hide();
    }

我不知道从 If 语句中去哪里,所以任何帮助将不胜感激。

【问题讨论】:

    标签: c# datatable


    【解决方案1】:

    循环浏览客户端程序中的行正是您不想想要做的事情。让数据库为您完成这项工作。试试这个:

    private void BtnDelete_Click(object sender, EventArgs e)// Sends to ConfirmDeleteEMP Form 
    {     
        object result;       
        string query = "SELECT PayrollNo FROM [Employee] WHERE FirstName + ' ' + LastName = ?"; 
        string connstring = @"Provider = Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\\HoliPlanData.accdb;Persist Security Info=False";
    
        using (OleDbConnection conn = new OleDbConnection(connstring))
        using (OleDbCommand cmd = new OleDbCommand(query, conn))
        {
            //guessing at type and length here
            cmd.Parameters.Add("?", OleDbType.VarWChar, 50).Value = DropBoxEmp.Text;
    
            conn.Open();
            result = cmd.ExecuteScalar();                                        
        }
    
        if (result != null && result != DBNull.Value)
        {
            ConfirmDeleteEMP form = new ConfirmDeleteEMP();
            form.PassValueName = DropBoxEmp.Text;
            form.PassSelectedPayroll = (int)result;
            form.Tag = this;
    
            form.Show(this);
            Hide();
        }                    
    }
    

    如果您真的想不顾一切地循环遍历行(速度较慢,需要编写更多代码,而且更容易出错),您可以这样做:

    private void BtnDelete_Click(object sender, EventArgs e)// Sends to ConfirmDeleteEMP Form 
    {                   
        DataTable table = new DataTable();
        string query = "SELECT PayrollNo, (FirstName + ' ' + LastName) AS NAME FROM [Employee]"; 
        string connstring = @"Provider = Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\\HoliPlanData.accdb;Persist Security Info=False";
        using (OleDbConnection conn = new OleDbConnection(connstring))
        {                    
            OleDbDataAdapter adapter = new OleDbDataAdapter(query, conn);
            adapter.Fill(table);                                        
        }
    
        int PayrollNumber = 0;
        foreach (DataRow ThisRow in table.Rows)
        {
            if (DropBoxEmp.Text == ThisRow["NAME"])
            {
                PayrollNumber = (int)ThisRow["PayrollNo"];
                break;
            }  
        }
        //the whole loop could also be consolidated to this:
        //PayrollNumber = (int)table.Rows.First(r => r["NAME"] == DropBoxEmp.Text)["PayrollNo"];
    
        ConfirmDeleteEMP form = new ConfirmDeleteEMP();
        form.PassValueName = DropBoxEmp.Text;
        form.PassSelectedPayroll = PayrollNumber ;               
        form.Tag = this;
        form.Show(this);
        Hide();
    }
    

    【讨论】:

    • 嗨乔尔,我喜欢让数据库为我检查的想法,刚刚尝试了顶部代码并在“form.PassSelectedPayroll = (int)结果;”这是因为什么?
    • 因为您将PassSelectedPayroll 属性定义为字符串。
    【解决方案2】:

    嗯,很难猜出你的问题到底是什么。但我认为您只想从当前行获取 PayrollNo,不是吗?

    关于下线...

    var GoodNumber = (table.Rows[OurNumber]["PayrollNo"].ToString());
    

    ...我想你可以打电话:

    if (...)
    {
        OurNumber = ThisRow["PayrollNo"].ToString();
        GotTheNumber = true;
    }
    

    但是,我不知道您在使用以下 if 条件做什么,以及这是否真的符合您的要求:

    if (SelectedName = (table.Rows[ThisRow]))
    {
    ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-11
      • 1970-01-01
      • 2010-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多