Wie füge ich der vorhandenen Datentabelle eine neue Spalte mit Wert hinzu?

70

Ich habe eine Datentabelle mit 5 Spalten und 10 Zeilen. Jetzt möchte ich der DataTable eine neue Spalte hinzufügen und der neuen Spalte den Wert DropDownList zuweisen. Daher sollte der DropDownList-Wert zehnmal zur neuen Spalte hinzugefügt werden. Wie macht man das? Hinweis: Ohne FOR LOOP.

Zum Beispiel: Meine vorhandene Datentabelle sieht so aus.

   ID             Value
  -----          -------
    1              100
    2              150

Jetzt möchte ich dieser Datentabelle eine neue Spalte "CourseID" hinzufügen. Ich habe eine DropDownList. Der ausgewählte Wert ist 1. Meine vorhandene Tabelle sollte also wie folgt aussehen:

    ID              Value         CourseID
   -----            ------       ----------
    1                100             1
    2                150             1

Wie macht man das?

der Van
quelle
@CheckRaise: Das Abschließen der Schleife würde länger dauern, wenn die DataTable mehr Datensätze enthält.
Thevan

Antworten:

131

Ohne For-Schleife:

Dim newColumn As New Data.DataColumn("Foo", GetType(System.String))     
newColumn.DefaultValue = "Your DropDownList value" 
table.Columns.Add(newColumn) 

C #:

System.Data.DataColumn newColumn = new System.Data.DataColumn("Foo", typeof(System.String));
newColumn.DefaultValue = "Your DropDownList value";
table.Columns.Add(newColumn);
Keith Walton
quelle
12
+1 Ich nehme das zurück. Das Einrichten der Spalte mit dem DefaultValue anschließenden Hinzufügen zur ColumnsSammlung hat den gewünschten Effekt, dass sie auf alle vorhandenen Zeilen angewendet wird. Das Hinzufügen zu Columnsund das anschließende Festlegen von führt DefaultValuejedoch nicht zum gleichen Ergebnis (in diesem Fall funktioniert es nur für neu hinzugefügte und nicht für vorhandene Zeilen).
Ahmad Mageed
Warum wird die Tabelle im aktuellen Kontext nicht beendet?
Hacki
14

Fügen Sie die Spalte hinzu und aktualisieren Sie alle Zeilen im DataTableBeispiel:

DataTable tbl = new DataTable();
tbl.Columns.Add(new DataColumn("ID", typeof(Int32)));
tbl.Columns.Add(new DataColumn("Name", typeof(string)));
for (Int32 i = 1; i <= 10; i++) {
    DataRow row = tbl.NewRow();
    row["ID"] = i;
    row["Name"] = i + ". row";
    tbl.Rows.Add(row);
}
DataColumn newCol = new DataColumn("NewColumn", typeof(string));
newCol.AllowDBNull = true;
tbl.Columns.Add(newCol);
foreach (DataRow row in tbl.Rows) {
    row["NewColumn"] = "You DropDownList value";
}
//if you don't want to allow null-values'
newCol.AllowDBNull = false;
Tim Schmelter
quelle
Und mit DefaultValuefür new System.Data.DataColumn?
Kiquenet
@Kiquenet: Warum sollte ich das verwenden? Wäre es dann nicht ein Duplikat von Keiths Antwort ? Die Verwendung DefaultValueist nur ein anderer Ansatz. Dieser funktioniert auch und ist nicht weniger effizient, nur ein bisschen weniger prägnant. Es hat auch keine Nachteile, Sie müssen sich nicht merken, ob Sie die Spalte hinzufügen können, bevor Sie den Standardwert anwenden. Wenn Sie diesen Wert nur einmal beim Hinzufügen der Spalte zur Tabelle verwenden möchten, müssen Sie ihn DefaultValueerneut entfernen .
Tim Schmelter
2
Hat das OP nicht einfach gesagt, OHNE FOR LOOP ZU VERWENDEN ?
Pikachu620
@ Pikachu620: Nun, die for-Schleife ist in der akzeptierten Antwort nur im Framework versteckt . Beide Ansätze sind gleich effizient, wählen Sie, was besser lesbar ist oder woran Sie sich erinnern, wenn Sie es brauchen :)
Tim Schmelter
@MitchWheat: bereits kommentiert. Ich behalte meine Antwort, denn daran werden sich die meisten Menschen erinnern, wenn sie sie tatsächlich brauchen, und es ist nichts Schlechtes, diesen Ansatz zu verwenden. Die Verwendung des DefaultValue ist elegant, aber Sie müssen sich die Reihenfolge merken, wenn Sie ihn verwenden müssen. Es verwendet übrigens auch eine for-Schleife
Tim Schmelter
-2
//Data Table

 protected DataTable tblDynamic
        {
            get
            {
                return (DataTable)ViewState["tblDynamic"];
            }
            set
            {
                ViewState["tblDynamic"] = value;
            }
        }
//DynamicReport_GetUserType() function for getting data from DB


System.Data.DataSet ds = manage.DynamicReport_GetUserType();
                tblDynamic = ds.Tables[13];

//Add Column as "TypeName"

                tblDynamic.Columns.Add(new DataColumn("TypeName", typeof(string)));

//fill column data against ds.Tables[13]


                for (int i = 0; i < tblDynamic.Rows.Count; i++)
                {

                    if (tblDynamic.Rows[i]["Type"].ToString()=="A")
                    {
                        tblDynamic.Rows[i]["TypeName"] = "Apple";
                    }
                    if (tblDynamic.Rows[i]["Type"].ToString() == "B")
                    {
                        tblDynamic.Rows[i]["TypeName"] = "Ball";
                    }
                    if (tblDynamic.Rows[i]["Type"].ToString() == "C")
                    {
                        tblDynamic.Rows[i]["TypeName"] = "Cat";
                    }
                    if (tblDynamic.Rows[i]["Type"].ToString() == "D")
                    {
                        tblDynamic.Rows[i]["TypeName"] = "Dog;
                    }
                }
Dhiraj Shejale
quelle