Laden...

DataGridView mit erster Zeile einer DataTable füllen

Erstellt von simu2k vor 12 Jahren Letzter Beitrag vor 12 Jahren 3.803 Views
S
simu2k Themenstarter:in
7 Beiträge seit 2011
vor 12 Jahren
DataGridView mit erster Zeile einer DataTable füllen

Guten Abend

++Entwicklungsumgebung : Visual Studio 2010 ++

An folgender Problematik hirne ich nun schon den ganzen Tag rum:

Ich habe eine DataTable mit Werten aus einer ExcelListe abgefüllt. Von dieser DataTabel möchte ich gerne die erste Zeile in die erste Spalte eines DataGridView's abfüllen, ohne dabei Spalten mit leeren Einträgen mitzunehmen. Das DataGridView ist dabei pflicht, auf eine andere Windows Form Komponente kann ich nicht setzen.

Hier ein Code-Ausschnitt um zu zeigen, wo ich momentan stehe:



object[] arr = new object[myDataTable.Columns.Count];  
myDataTable.Rows[0].ItemArray.CopyTo(arr,0); // mit diesem Code ist es möglich, die erste Zeile einer DataTable auszulesen und sie in ein ObjektArray namens "arr" abzufüllen


Soweit so gut, jedoch enthält das Objekt Array "arr" sogenannte "null" und empty(leere) Einträge, welche davon kommen, dass in der DataTable Spalten vorhanden sind, welche leer sind. Diese sollen natürlich nicht in das DataGridView abgefüllt werden.

Ich habe mir überlegt mit einem for-loop das Array "arr" der ersten Spalte des DataGridViews dvgRowNames zu übergeben. Dabei möchte ich überprüfen, ob das jeweilige ArrayElement "leer" oder "null" ist. Falls nicht, soll das ArrayElement in das DatagridView abgefüllt werden und das nächste ArrayElement unter die Lupe nehmen. Hier mal ein Code-Ansatz dazu:




for (int i = 0; i < arr.Length; i++)
            {
                if(arr[i] != null )
                {
                    dgvRowNames.Rows[i].Cells[0].Value = (arr[i].ToString());
                }
            }

Es scheint mir jedoch, dass ich mit arr_ nicht direkt auf den Inhalt des Arrays zugreifen kann. Um dies zu können, müsste ich mit der .ToString Methode versuchen, den Inhalt des ArrayElementes in einen STring zu verwandeln.
Dies führt aber zu Exceptions, alsbald die .ToString Methode versucht ein "null" Arrayelement in einen String umzuwandeln...
Suche ich zu weit oder gäbe es irgend eine einfachere Methode, um meinem Ziel näher zu kommen?

Ich bin mal gespannt auf eure Hilfe und bedanke mich bereits im Voraus für eure Hilfe.

T
18 Beiträge seit 2008
vor 12 Jahren

Hi,

also das müsste mit dem is Schlüsselwort gehen...

Bsp.



if(arr[i] is String && arr[i] != null)
{
     dgvRowNames.Rows[i].Cells[0].Value = (arr[i].ToString());
}


Lg Mike

So long and thanks for all the fish !

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo simu2k,

das DGV ist in der Hauptsache fürs DataBinding gemacht. Erstelle aus der DataTable eine neue DataTable, in die du nur die erste Zeile der ersten DataTable packst. Binde die neue DataTable an das DGV.

Der Umweg über ein Object-Array und den sich daraus ergebenden Abfrage- und Casting-Problematik, ist Mist.

herbivore

S
simu2k Themenstarter:in
7 Beiträge seit 2011
vor 12 Jahren

Herzlichsten Dank an TrueDevil und herbivore für euere Vorschläge.

@ herbivore : Ich habe nun trotzdem den Mist Weg beschreiten müssen, weil ich schlicht keine Lösung fand, wie ich aus der ersten Zeile einer DataRow sprich DataTable, leere Einträge (DBNull Werte) ignorieren kann. Diese DBNull Werte dürfen nicht in das DataGridView übernommen werden.

Anbei die Lösung, wie ich es nun realisiert habe



 DataSet dtSet = _xlsReader.GetFields(strSelectedExcelFilename, strSelectedTabelName); // hier wird das DataSet dtSet mit der ausgewählten Excel Tabelle abgefüllt
         
            DataRow dRtest = dtSet.Tables["Table"].Rows[0];  // liest die erste Zeile des Dataset "Table" in eine DataRow

            object[] arr;

            arr = dRtest.ItemArray; // Kopiert das DataRow in ein objekt Array
           
            for (int i = 0; i < arr.Length; i++) // for-Schleife, welche überprüft ob das entsprechnde Array Element dem leeren DataRow Eintrag DBNull.Value entspricht. Falls nicht, wird das ArrayElement dem DataGridView dvgRowNames hinzugefügt
            {
                if (arr[i] != DBNull.Value) {
                    dgvRowNames.Rows.Add(arr[i].ToString());
                }
            }

mit dieser Variante wird zwar ein gefährlicher Umweg über ein Objekt Array gemacht, aber immerhin kann ich so die DBNull.Einträge "rausfiltern".

gruss, simu2k

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo simu2k,

ich bin nun nicht der DGV-Experte, aber es würde mich wundern, wenn das DGV nicht mit null bzw. DbNull umgehen könnte.

herbivore

S
simu2k Themenstarter:in
7 Beiträge seit 2011
vor 12 Jahren

Guten Morgen herbivore

Ob ein DGV mit DBNull.Value werten umgehen kann, habe ich nicht ausprobiert. Für meine Applikation ist es jedoch Pflicht, dass keine "null" oder "leere" Einträge ins DGV abgefüllt werden 😃.

Deshalb die ganze Geschichte um das Rausfiltern von DBNull WErten aus einem ObjektArray.

Wünsche noch einen angenhemen TAg

Gruss simu2k

R
158 Beiträge seit 2007
vor 12 Jahren

Ob ein DGV mit DBNull.Value werten umgehen kann, habe ich nicht ausprobiert. Und warum nicht? Denn dann wüsstest du, dass das DGV sehr geschmeidig mit NullValues umgehen kann.

Allerdings sehe ich JETZT erst, was Du machst: Jede Spalte der DataRow wird als neue ZEILE im DGV hinzugefügt, also eine senkrechte Abbildung einer waagerechten Zeile... DANN ist es verständlich, dass keine NULL-Zeilen vorhanden sein düerfen 😉

Vereinfacht kannst du aber auch das hier machen, ohne den 'Umweg' üver ein extra ItemArray (weil die Spalten einer DataRow direkt über den Index angesprochen werden können):

            for (int i = 0; i < dRtest.ItemArray.Length; i++) 
            {
                if (dRtest[i] != DBNull.Value) {
                    dgvRowNames.Rows.Add(dRtest[i].ToString());
                }
            }