簡體   English   中英

C#遍歷DataTable中的行

[英]C# Iterate through rows in a DataTable

我正在嘗試遍歷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語句去哪里,所以將不勝感激任何幫助。

遍歷客戶程序中的行確實是您想要的。 讓數據庫為您完成這項工作。 嘗試這個:

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();
}

嗯,很難猜出你到底是什么問題。 但是我認為您只想從當前行中獲取PayrollNo,不是嗎?

關於進一步下降的線...

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

...我想您可以致電:

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

但是 ,我不知道您如何使用以下if條件以及是否確實滿足您的要求:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM