Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Jakub Ruchtr :1.2.2021 23:19

Snažil jsem se vytvořit jednoduchou form aplikaci, ale vyhodilo mi to error neošetřená výjimka, že objekt table je nula. používám třídu DataTable konkrétně funkci table.Rows.Add

zdrojový kód:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace notes_app
{
    public partial class Form1 : Form
    {

        public DataTable table;

        public Form1()
        {
            InitializeComponent();
        }

        private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {

            DataTable table = new DataTable();

            table.Columns.Add("Title", typeof(String));
            table.Columns.Add("Messages", typeof(String));
            dataGridView1.DataSource = table;
            dataGridView1.Columns["Messages"].Visible=false;
            dataGridView1.Columns["Title"].Width=317;
        }

        private void btmNew_Click(object sender, EventArgs e)
        {
            textTitle.Clear();
            textMessage.Clear();
        }

        private void btmSave_Click(object sender, EventArgs e)
        {

            table.Rows.Add(textTitle.Text, textMessage.Text); // zde to hlásí error

            textTitle.Clear();
            textMessage.Clear();
        }

        private void btmRead_Click(object sender, EventArgs e)
        {
            int index = dataGridView1.CurrentCell.RowIndex;

            if (index>-1)
            {
                table.Rows[index]["Title"].ToString();
                table.Rows[index]["Messages"].ToString();
            }
        }

        private void btmDelete_Click(object sender, EventArgs e)
        {
            int a = dataGridView1.CurrentCell.RowIndex;
            table.Rows[a].Delete();
        }
    }
}

Zkusil jsem: Jediný co mě napadlo že tam něco k něčemu nemá přístup, ale jinak vůbec netuším.

Chci docílit: aby aplikace fungovala

 
Odpovědět
1.2.2021 23:19
Avatar
zelvicek
Člen
Avatar
zelvicek:2.2.2021 8:04

Doporučuju si přečíst něco o deklaracích fieldů, lokálních proměnných a rozsazích jejich platností.

 
Nahoru Odpovědět
2.2.2021 8:04
Avatar
Tadeáš Burda
Brigádník
Avatar
Odpovídá na Jakub Ruchtr
Tadeáš Burda :2.2.2021 8:07
private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {

            DataTable table = new DataTable();

            table.Columns.Add("Title", typeof(String));
            table.Columns.Add("Messages", typeof(String));
            dataGridView1.DataSource = table;
            dataGridView1.Columns["Messages"].Visible=false;
            dataGridView1.Columns["Title"].Width=317;
        }

Tady inicializujes tu tiredu vnutri tej metody.

public DataTable table;

Tady ju mas venku ale neinicializujes ju nikde(v konstrukte narp). Pokat ti to pada tady

private void btmSave_Click(object sender, EventArgs e)
        {

            table.Rows.Add(textTitle.Text, textMessage.Text); // zde to hlásí error

            textTitle.Clear();
            textMessage.Clear();
        }

tak proto lebo to pouziva tuto

public DataTable table;

Musis ju nekde najprv inilializovat napr vtem konstrukte. Nerobim WF ale jestli ju inicilizujes nekde inde(binding napr) tak tam je chyba

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
2.2.2021 8:07
Avatar
Tadeáš Burda
Brigádník
Avatar
Odpovídá na Jakub Ruchtr
Tadeáš Burda :2.2.2021 8:09

Jo a pouzivat nazev 2x taky isti v jednej class je chyba lebo sa ti to pak plete...Bud vtej metode daj co ja vim tableXXX alebo aspon ked pouzivas tu public DataTable table; tak daj prednu this.table

 
Nahoru Odpovědět
2.2.2021 8:09
Avatar
Michal Šebesta:2.2.2021 8:10

Problém je v tom, že když ve funkci dataGridView1_Ce­llContentClick do proměnné table vytváříš novou tabulku, tak se ti neuloží do dříve vytvořené proměnné table, ale vytvoří se ti nová lokální proměnná, která se po dokončení funkce smaže. Když poté přistupuješ k table, tak to vyhodí výjimku protože table je null.

Vyřešit to můžeš tak, že na řádku DataTable table = new DataTable(); smažeš to DataTable na začátku.

 
Nahoru Odpovědět
2.2.2021 8:10
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.