2009-09-29 84 views
0

我試圖找到一個行,然後從數據表中刪除該行。我不斷收到nIndex = -1。任何人都有建議?數據表Rows.IndexOf()

protected void cbxSelected_CheckedChanged(object sender, EventArgs e) 
{ 
CheckBox checkbox = (CheckBox)sender; 
GridViewRow row = (GridViewRow)checkbox.NamingContainer; 
string sSampleId = row.Cells[1].Text; 

if (!string.IsNullOrEmpty(sSampleId)) 
{ 
    DataTable dt; 

    if (ViewState["dtTemp"] != null) 
    { 
    dt = (DataTable)ViewState["dtTemp"]; 
    } 
    else 
    { 
    dt = new DataTable(); 
    dt.Columns.Add("sample_id"); 
    } 

    DataRow dr; 
    string[] drow = new string[] { sSampleId }; 
    dr = dt.NewRow(); 
    dr.ItemArray = drow; 

    if (checkbox.Checked == true) 
    { 
    dt.Rows.Add(dr); 
    } 
    else if (checkbox.Checked == false) 
    { 
    int nIndex = dt.Rows.IndexOf(dr); 
    dt.Rows.RemoveAt(nIndex); 
    } 

    ViewState.Add("dtTemp", dt); 
} 
} 

回答

0

既然你創建一個新的DataRow

dr = dt.NewRow(); 

你不會在數據表中找到它。

要刪除,在數據表是行:

int nIndex = dt.Rows.IndexOf(row); 

int nIndex = dt.Rows.IndexOf(dr); 

編輯: 或許不是。你可能會在整個數據表必須循環和列比較值:

for (var i = dt.Rows.Count; i >= 0; i--) 
    if (dt.Rows[i].Cells[1].Text == sSampleId) { 
    dt.Rows.Remove(i); 
    break; 
    } 
} 
+0

我想通過建立的數據行,我將能夠找到該行的數據表。我記得在VB中這樣做,但C#似乎有點小氣。我嘗試了循環遍歷表的建議,並刪除了查找行,這是有效的。感謝您的意見。 – Kris 2009-09-29 15:25:12

0

查找並給予其ID的ADO.NET DataTable刪除行:

DataRow[] found = dt.Select("sample_id = " + sample_id); 
if (found.Length < 0) 
{ 
    found[0].Delete(); 
} 

注這有DeleteRemove之間的差異。 Delete改變該行的狀態RowState.Deleted,這使得它從DataTable消失大多數的目的。但它仍然存在。這一點很重要,如果您使用的是數據適配器向DataTable與底層數據庫表同步跟進:適配器將刪除基礎行,當你調用它的Update方法,然後才從Rows集合中刪除的行。

如果你不使用數據適配器,它是確定使用Remove刪除一行。