JumpingJezza
JumpingJezza

Reputation: 5665

How to add a new row to c# DataTable in 1 line of code?

Is it possible to add a new row to a datatable in c# with just 1 line of code? I'm just dummying up some data for a test and it seems pretty slow to have to write something like this:

DataTable dt= new DataTable("results");
DataRow dr1 = dt.NewRow();
dr1[0] = "Sydney";
dt.Rows.Add(dr1);
DataRow dr2 = dt.NewRow();
dr2[0] = "Perth";
dt.Rows.Add(dr2);
DataRow dr3 = dt.NewRow();
dr3[0] = "Darwin";
dt.Rows.Add(dr3);

I was assuming you could do something like the code below, but I can't find the correct syntax.

dt.Rows.Add(dt.NewRow()[0]{"Sydney"});
dt.Rows.Add(dt.NewRow()[0]{"Perth"});
dt.Rows.Add(dt.NewRow()[0]{"Darwin"});

And yes I know in the time I've taken to write this question I could have finished coding it the long way instead of procrastinating about it :)

Thanks!

Upvotes: 19

Views: 88078

Answers (5)

dkostas
dkostas

Reputation: 85

To quickly create a new DataTable with some data you can do all in one line:

DataTable testData = new DataTable( "TestData" ) {
    Columns = { "TestColumn1", "TestColumn2" },
    Rows = {
        { "Row1Col1Val", "Row1Col2Val"},
        { "Row2Col1Val", "Row2Col2Val"}
    }
};

Upvotes: 3

DataTable dtStudent = new DataTable();

//Add new column
dtStudent.Columns.AddRange (
new DataColumn[] {
new DataColumn("SlNo", typeof(int)), 
new DataColumn("RollNumber", typeof(string)),
new DataColumn("DateOfJoin", typeof(DateTime)),
new DataColumn("Place", typeof(string)),
new DataColumn("Course", typeof(string)),
new DataColumn("Remark", typeof(string))
}
);
// Add value to the related column
dtStudent.Rows.Add(1, "10001", DateTime.Now, "Bhubaneswar", "MCA", "Good");

Upvotes: 3

Jeff Ogata
Jeff Ogata

Reputation: 57783

Yes, you can do the following:

dt.Rows.Add("Sydney");

Upvotes: 22

RPM1984
RPM1984

Reputation: 73112

If you're doing this for Unit Tests, why not just use a helper method, either in some static class, or better yet a test base class?

I have all test classes inheriting from a TestBase class, where i can add stuff to help out all the tests.

e.g

[TestClass]
public class TestBase
{
   protected void AddMockDataRow(DataTable dt)
   {
      DataRow dr = dt.NewRow();
      dr[0] = "Sydney"; // or you could generate some random string.
      dt.Rows.Add(dr);
   }
}

Then in your test class:

[TestClass]
public class SomeTest : TestBase
{
    [TestMethod]
    public void Ensure_Something_Meets_Some_Condition()
    {
       // Arrange.
       DataTable dt = new DataTable("results");

       // Act.
       AddMockDataRow(dt);

       // Assert.
       Assert.IsTrue(someCondition);
    }
}

The goal here is to keep your test code minimal and reduce redundant code (not to be DRY).

HTH

Upvotes: 3

Chris
Chris

Reputation: 40613

Another way would be to make a helper function to do it:

DataTable MakeDataTable(String name, String contents)
{
  DataTable dt = new DataTable(name);
  foreach (string val in contents.Split(","))
  {
    DataRow dr = dt.NewRow();
    dr[0] = val;
    dt.Rows.Add(dr);
  }
  return dt;
}

MakeDataTable("results","Sydney,Perth,Darwin");

Upvotes: 3

Related Questions