Uni Le
Uni Le

Reputation: 793

Delete and remove the row matching string?

I want to search for a string in DataTable if it starts with "null" delete this string, if this row has no values then erase this row too. Can someone show me how to do it?

ID    Name   Comment
2     lola    hallo
5     miky    hi
      null0          // delete null0 and remove this row     
      null1   ko     // delete null1 but do not remove this row
1      hub    why
3     null2          //delete null2 but do not remove this row

I tried to delete "null" but it doesn't work.

My Code:

int ct1 = 0;
for (int i = 0; i < resE1.Rows.Count; i++ )
{
    if(resE1.Rows[i]["SignalName"].ToString() == "null" + ct1)
    {
        resE1.Rows[i].SetField<String>(2, "");
    }
    ct1++;
}

I find a solution to replace "null*" with empty spaces, but now I want to erase this row if the cells values of this row are empty, how can i do it?

int ct1 = 0;
for (int i = 0; i < resE1.Rows.Count; i++)
{
    string fix = resE1.Rows[i]["SignalName"].ToString();

    if(fix.Contains("null"))
    {
        resE1.Rows[i].SetField<String>(2, "");
    }
    ct1++;
}

Upvotes: 0

Views: 3265

Answers (5)

muhammad kashif
muhammad kashif

Reputation: 2624

You need something like this:

String test = "Null01";
if (test.IndexOf("Null") == 0)
{
    test = test.Replace("Null", String.Empty);
}

For second part of your question, just check if Comments are null or empty then replace the string too.

Arrange code according to your own requirement.

Upvotes: 0

swabs
swabs

Reputation: 515

To answer one of your questions, to delete the entire row do something like this:

if(resE1.Rows[i].Contains("null") && (resE1.Rows[i]["ID"].ToString() == "") && (resE1.Rows[i]["Comment"].ToString() == ""))
{
    resE1.Rows[i].Delete();
}

bool emptyFlag = false;
if(resE1.Rows[i].Contains("null"))
{
    for(int j = 0; j < resE1.Columns.Count; j++)
    {
       if(resE1.Rows[i][j].Equals(""))
        emptyFlag = true;
       else
        emptyFlag = false;
    }
   if(emptyFlag)
    resE1.Rows[i].Delete();
}

Upvotes: 1

StaWho
StaWho

Reputation: 2498

Assuming your DataTable has column "Name" of type string you can achieve it like this:

private DataTable RemoveUnwanted(DataTable source)
{
    var rowsEnu = source.Rows.GetEnumerator();
    while (rowsEnu.MoveNext())
    {
        ((DataRow)rowsEnu.Current)["Name"] = ((DataRow)rowsEnu.Current)["Name"].ToString().StartsWith("null") ? string.Empty : ((DataRow)rowsEnu.Current)["Name"];
    }

    return (from i in source.AsEnumerable()
            where !(i.ItemArray.All(o => string.IsNullOrEmpty(o.ToString())))
            select i).CopyToDataTable();
}

You will also need reference to System.Data.DataSetExtensions.

Upvotes: 1

Nikola Davidovic
Nikola Davidovic

Reputation: 8666

Here is your code changed so it works although I don't like how it is written. Check the answer:

int ct1 = 0;
int i = 0;
while(i < dt.Rows.Count)
{
    if ( dt.Rows[i]["Name"].ToString() == "null" + ct1)
    {
        if ((dt.Rows[i][0] == null || dt.Rows[i][0].ToString() == string.Empty) && (dt.Rows[i][2] == null || dt.Rows[i][2].ToString() == string.Empty))
        {
            dt.Rows.RemoveAt(i);
            i--;
        }
        else
        {
            dt.Rows[i].SetField<String>(1, "");
        }
        ct1++;
    }
    i++;
}

Upvotes: 1

alex_java_kotlin
alex_java_kotlin

Reputation: 439

I tried this. Works for me.

List<DataRow> rowsToRemove = new List<DataRow>();
foreach (DataRow dr in resE1.Rows)
{
    if (dr["Name"].ToString().IndexOf("null") == 0)
    {
        dr.SetField("Name", "");
    }
    bool hasValue = false;
    for (int i = 0; i < dr.ItemArray.Count(); i++)
    {
        if (!dr[i].ToString().Equals(String.Empty))
           hasValue = true;
    }
    if (!hasValue) rowsToRemove.Add(dr);
}
foreach(DataRow dr in rowsToRemove)
{
    dr.Delete();
}

Upvotes: 1

Related Questions