Importowanie danych do datagridview / c#

0

Witam,

Mam problem z datagridview. Importuję dane z pliku txt.

Przed importem tabela wygląda tak:
user image
Po zaimportowaniu tabela wygląda tak:
user image

Source z pobierania danych do datagridview:

OpenFileDialog openFileDialog1 = new OpenFileDialog();
            openFileDialog1.Filter = "Plik magazynu|*.txt";
            openFileDialog1.Title = "Wczytaj magazyn";
            openFileDialog1.ShowDialog();
            if (openFileDialog1.FileName != "")
            {
                file = new System.IO.StreamReader(openFileDialog1.FileName);
                string[] columnnames = file.ReadLine().Split('|');
                DataTable dt = new DataTable();
                foreach (string c in columnnames)
                {
                    dt.Columns.Add(c);
                }
                string newline;
                while ((newline = file.ReadLine()) != null)
                {
                    DataRow dr = dt.NewRow();
                    string[] values = newline.Split('|');
                    for (int i = 0; i < values.Length; i++)
                    {
                        dr[i] = values[i];
                    }
                    dt.Rows.Add(dr);
                }
                file.Close();
                dataGridView1.DataSource = dt; 

Jak widać kod tworzy mi nie potrzebnie kolumny i wiersze. Jak przekształcić kod aby one nie powstawały, tylko przypisywały mi do tych wartości co mam już na stałe przypisane w datagridview?

0

Pozbądź się tego DataTable, a w pętli po prostu wstawiaj dane do odpowiedniego wiersza i kolumny po indeksie.

0

Mógłbyś mi to pokazać jakoś na przykładzie? :)

EDIT.

Chyba udało mi się to zrobić, tzn. Wyświetla się dobrze ale jeszcze funkcjonalności itd nie przetestowałem.
Kodzik:

 
            OpenFileDialog openFileDialog1 = new OpenFileDialog();
            openFileDialog1.Filter = "Plik magazynu|*.txt";
            openFileDialog1.Title = "Wczytaj magazyn";
            openFileDialog1.ShowDialog();
            if (openFileDialog1.FileName != "")
            {

                file = new System.IO.StreamReader(openFileDialog1.FileName);
                string line = file.ReadLine();
                while ((line = file.ReadLine()) != null)
                {
                    if (!line.StartsWith("~~") && line != String.Empty)
                    {
                        dataGridView1.Rows.Add(line.Split(new string[] { "|" }, StringSplitOptions.RemoveEmptyEntries).Select(s => s.Trim()).ToArray());
                    }
                }
                file.Close();
0

Powstał mi mianowicie inny problem.

Używam w programie jako "zakładek" programu, właściwość "Tabcontrol".
W jednej z zakładek mam DataGridView, wszystko działa jak talala tylko, że mam mankament przy imporcie danych. Po imporcie danych z pliku .txt gdy wchodzę do zakładki tam gdzie mam tą tabelę nic nie pokazuje. Raczej na pewno psuje mi to wiersz:

dataGridView1.Rows.Clear();

, ponieważ gdy wyrzucę go z kodu to dane się pojawiają. Jakieś sugestie gdzie on by mógł się znaleźć? Jest mi on potrzebny, gdyż musi mi za każdym razem gdy zmienię zakładkę "wyczyścić" tabelę, aby dane się nie dublowały itd.
Gdy nie importuje danych, działam bez wczytanego pliku to wszystko mi dobrze działa.
kodzik:

 
int usun;
            //usun = dataGridView1.CurrentCellAddress.Y;
            usun = dataGridView1.CurrentCell.RowIndex;

            try
            {
                if (usun != -1)
                {
                    Magazyn.RemoveAt(usun);
                    iloscProduktow -= 1;
                    tabControl1_Selected(sender, null);
                }
            }
            catch
            {
                MessageBox.Show("Nie można usunąć pustego rekordu");
            }

Część kodu z właściwości TabControl:

 
private void tabControl1_Selected(object sender, TabControlEventArgs e)
        {
            listBox1.Items.Clear();
            textBox5.Clear();
            textBox7.Clear();
            textBox8.Clear();
            dataGridView1.Rows.Clear();
            comboBox2.Items.Clear();
            comboBox3.Items.Clear();
            label29.Text = "0";
            textBox5.Enabled = false;
            textBox7.Enabled = false;
0

Nie lepiej zamiast DataGrid użyć po prostu ListView?
http://csharp.net-informations.com/gui/cs-listview.htm

0

Z tego co rozumiem to za każdym razem kiedy przełączasz tab'a to czyścisz kontrolkę DataGrid. Skoro to robisz to logicznym jest że nic na niej nie będzie, a więc kiedy znów przełączysz się na tab'a gdzie jest ta kontrolka będziesz musiał wstawić dane na nowo. Pytanie tylko czy jest konieczne czyszczenie tej kontrolki za każdym razem?

0

Jest konieczne, dlatego że za każdym razem przełączając taba, dane w gridzie mi się dublują.
Po przełączeniu na grida:
user image
Gdy zmienię zakładkę i przełączę ponownie na grida:
user image

0

z Twojego opisu wynika że masz podpięte zdarzenie na zmianę zaznaczonej karty w TabControl
przypuszczam że ponowne ładowanie danych , pokaż cały kod lub podeślij kod formularza na priv to pomogę Ci się z tym uporać

0

Udało mi się to rozwiązać. Po prostu musiałem ogarnąć import danych z pliku tak, aby to były dane a nie na sztywno wpisane wartości do komórek. Gdy to zrobiłem, nie było potrzeb aby walczyć z tym tabcontrolem.

Ostatni mój napotkany problem nad którym długo myślę to zmiana wartości w danej komórce datagrid.

Mam taki oto kod:

 private void button9_Click(object sender, EventArgs e)
        {
             if (Convert.ToInt32(textBox8.Text) <= Convert.ToInt32(label29.Text))
            {
                int a;
                a = Convert.ToInt32(label29.Text) - Convert.ToInt32(textBox8.Text);
                Lista nowaLista;
                int j = 0;
                for (int i = 0; i < iloscProduktow; i++)
                {
                    nowaLista = Magazyn[i];
                    nowaLista.Ilosc = a;
                    dataGridView1.Rows[i].Cells[j].Value = a;
                    j++;
                }
            }
        } 

Po naciśnięciu guzika ma mi zmienić wartość określonej komórki. Czyli w tym przypadku chodzi o kolumnę "Ilość". Niestety to co aktualnie mam zmienia mi wartość we wszystkich miejscach. Mam np 3 produkty które mają inną ilość, gdy zmienię wartość jednego produktu na daną wartość to wszystkie inne produkty zmieniają wartość na tą co podałem. Jakieś podpowiedzi co może być nie tak?

0

Osobiście stworzył bym klasę reprezentującą produkt, z nich stworzył BindingList<Produkt>, zaimplementował INotifyPropertyChanged, ustawił to jak DataSource do DataGridView i nie miał byś tylu problemów, bo operował byś na obiektach (np przy użyciu linq), DataGridView aktualizował by się automatycznie

0

A bez użycia Linq też dałoby radę? Po prostu nie znam tego jeszcze i wolałbym nie implementować czegoś czego nie znam póki co ;)

0

Tak, po prostu chodziło mi o to, że zamiast ręcznie zmieniać komórki, zrobił byś np tak:

 //zakładając że lista zawiera produkt o nazwie nazwa
this.Products.Where(x => x.Name.Equals("nazwa")).First().Price = 20;

i automatycznie by też odświeżyło na DGV. Możesz użyć serializacji i taką listę zapisać i wczytać w kilku linijkach :)

0

Odświeżam, jakieś pomysły? :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1