Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

C# functie stopt bij "toint"

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo,

Ik heb een stukje code waarbij een datagridview wordt gevuld met data. Daarnaast heb ik in de selected change event van die datagridview een code staan om weer iets met die gegevens te doen.

Op het moment dat ik in die event convert.toint gebruik stopt de loop die de grid vult.

Iemand een idee waarom dit gebeurt?

  • Cyphax
  • Registratie: November 2000
  • Laatst online: 21:11

Cyphax

Moderator LNX
Ik denk dat je iets meer informatie moet geven. Wat is "stopt"? Krijg je een exceptie? Zo ja: welke? Wat is de waarde die (niet) naar int geconverteerd wordt?

Post ook even de relevante (niet je hele project) code, want anders wordt het teveel koffiedik kijken.

Saved by the buoyancy of citrus


Verwijderd

Topicstarter
Hieronder vind je de 2 functies.
Als ik in de event alle conversies eruit haal werkt het wel.
Er komt geen error, maar hij doet hetzelfde als een break functie.
Hij laad maar één regel in de grid.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
 

private void Data_Load()
        {
            string[] users = Directory.GetDirectories(UserPath);
            foreach (string s in users )
            {
                string[] values = new string[userData.Count];
                iniContoller.IniFile(s + "\\GlobalInfo.ini");
                //Normale data laden
                int i = 0;
                foreach (string d in userData)
                {
                    string[] buf = d.Split(',');
                    string name = "";
                    if (buf.Length > 0)
                    {
                        name = buf[0];
                    }
                    values[i] = iniContoller.IniReadValue("Info", name);
                    i++;
                }
                dataGridView1.Rows.Add(values);
            }
        }


private void dataGridView1_SelectionChanged(object sender, EventArgs e)
        {
            string s = UserPath + "\\" + dataGridView1.SelectedRows[0].Cells[0].Value.ToString() + ".ini";
            iniContoller.IniFile(s + "\\Depths.ini");
            int i = Convert.ToInt32(iniContoller.IniReadValue("DepthsInfo", "Counter"));                                
            while (i > 0)
            {
               int o = 0;
               string[] values = new string[transactionData.Count];
               foreach (string setting in transactionData)
               {
                   values[o] = iniContoller.IniReadValue("DepthNo_" + i, setting);
                   o++;
               }
               i--;
               dataGridView2.Rows.Add(values);
            }
        }

  • Merethil
  • Registratie: December 2008
  • Laatst online: 02:13
Verwijderd schreef op maandag 10 maart 2014 @ 13:10:
Hieronder vind je de 2 functies.
Als ik in de event alle conversies eruit haal werkt het wel.
Er komt geen error, maar hij doet hetzelfde als een break functie.
Hij laad maar één regel in de grid.

[snip (code, groot)]
Gooi eens een try-catch om je toInt heen en kijk wat de exceptie is? Want blijkbaar gaat er iets mis in en zie je iets over het hoofd.
Een toInt doen zonder de waarde te checken is sowieso niet heel safe natuurlijk ;)

[ Voor 60% gewijzigd door Merethil op 10-03-2014 13:14 ]


Verwijderd

Topicstarter
Eventjes gedaan en de exeption is,
"De indeling van de invoortekenreeks is onjuist."

Ik weet 100% zeker dat er een juiste string terug komt uit de inifile, vandaar dat ik hem niet check. Misschien is het beter om een inireadinteger te maken waar de check al in zit.

  • Merethil
  • Registratie: December 2008
  • Laatst online: 02:13
Verwijderd schreef op maandag 10 maart 2014 @ 13:19:
Eventjes gedaan en de exeption is,
"De indeling van de invoortekenreeks is onjuist."

Ik weet 100% zeker dat er een juiste string terug komt uit de inifile, vandaar dat ik hem niet check. Misschien is het beter om een inireadinteger te maken waar de check al in zit.
Er komt een 100% juiste String uit de inifile en die zet je om naar een int? Misschien een trim() die je mist ofzo, als het een String vol met numerieke waarden moet zijn?

Verwijderd

Topicstarter
Nou, er komt een integer in de vorm van een string terug.
Dus "123" zoiets.

Ik ben nu bezig met een check in de conversie.

  • Alex)
  • Registratie: Juni 2003
  • Laatst online: 18-11 20:57
Lees Tips bij debuggen eens door, dit zal je op weg helpen.

Die "100% juiste string" zal toch niet helemaal juist zijn, aangezien je een error krijgt. Convert.ToInt32 verwacht een tekenreeks waar hij de cijfers uit kan halen, als je bijvoorbeeld nog quotes, spaties of control characters krijgt (zoals een newline-teken) gaat deze method op z'n bek. Let ook goed op de culture die je gebruikt tijdens het parsen: moet een string "123,45" worden geïnterpreteerd als "honderddrieëntwintig komma vijfenveertig" of als "twaalfduizend driehonderdvijfenveertig"?

We are shaping the future


Verwijderd

Topicstarter
Heb nu een safe ini.readint gemaakt en nu werkt hij wel.

Het vreemde is dat in de dataload dezelfde key wordt gelezen en geconvert als in de event, en die gaat wel goed. Dus de string is dus zoizo juist.

  • Merethil
  • Registratie: December 2008
  • Laatst online: 02:13
Verwijderd schreef op maandag 10 maart 2014 @ 13:28:
Heb nu een safe ini.readint gemaakt en nu werkt hij wel.

Het vreemde is dat in de dataload dezelfde key wordt gelezen en geconvert als in de event, en die gaat wel goed. Dus de string is dus zoizo juist.
In dataload stop je hem als String in een array, niet als een integer. Weet je wel zeker dat je weet welke types je gebruikt hiervoor, of ben je nou gewoon aan het raden "dat het goed zou moeten zijn"? Want een String en een int zijn nauwelijks compatible... ;)

Verwijderd

Topicstarter
Ik zal de voledige functies plaatsen.
Dit zijn de werkende, Wat ik heb gedaan is een functie gemaakt om integers te lezen uit de ini.
iniContoller.IniReadInt();

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
private void Data_Load()
        {
            string[] users = Directory.GetDirectories(UserPath);
            foreach (string s in users )
            {
                string[] values = new string[userData.Count];
                iniContoller.IniFile(s + "\\GlobalInfo.ini");
                //Normale data laden
                int i = 0;
                foreach (string d in userData)
                {
                    string[] buf = d.Split(',');
                    string name = "";
                    if (buf.Length > 0)
                    {
                        name = buf[0];
                    }


                    values[i] = iniContoller.IniReadString("Info", name);

                    i++;
                }
                //Schuld berekenen.

                int depthTotal = 0;
                int paymentTotal = 0;

                iniContoller.IniFile(s + "\\Depths.ini");
                i = iniContoller.IniReadInt("DepthsInfo","Counter");
                while (i > 0)
                {
                    depthTotal+= iniContoller.IniReadInt("DepthNo_" + i ,"Value");
                    i--;
                }

                iniContoller.IniFile(s + "\\Payments.ini");
                i = iniContoller.IniReadInt("PaymentsInfo","Counter");
                while (i > 0)
                {
                    paymentTotal += iniContoller.IniReadInt("PaymentNo_" + i, "Value");
                    i--;
                }
                values[3] = Convert.ToString(depthTotal - paymentTotal);
                dataGridView1.Rows.Add(values);
            }
        }
private void dataGridView1_SelectionChanged(object sender, EventArgs e)
        {

            string s = "";
            try
            {
                s = UserPath + "\\" + dataGridView1.SelectedRows[0].Cells[0].Value.ToString() + ".ini";
            }
            catch
            {

            }
            if (s != "")
            {
                iniContoller.IniFile(s + "\\Depths.ini");

                int i = iniContoller.IniReadInt("DepthsInfo", "Counter"); ;

                while (i > 0)
                {
                    int o = 0;
                    string[] values = new string[userHistoryData.Count];








                    foreach (string setting in userHistoryData)
                    {
                        values[o] = iniContoller.IniReadString("DepthNo_" + i, setting);
                        o++;
                    }
                    i--;
                    dataGridView2.Rows.Add(values);
                }
                iniContoller.IniFile(s + "\\Payments.ini");
                i = iniContoller.IniReadInt("PaymentsInfo", "Counter");
                while (i > 0)
                {
                    int o = 0;
                    string[] values = new string[userHistoryData.Count];
                    foreach (string setting in userHistoryData)
                    {
                        values[o] = iniContoller.IniReadString("PaymentNo_" + i, setting);
                        o++;
                    }
                    i--;
                    dataGridView2.Rows.Add(values);
                } 
            }   
        }

Verwijderd

Topicstarter
Nog een foutje ondekt, en nu werkt hij ook niet meer :S
s = UserPath + "\\" + dataGridView1.SelectedRows[0].Cells[0].Value.ToString() + ".ini";
Moet zijn,
s = UserPath + "\\" + dataGridView1.SelectedRows[0].Cells[0].Value.ToString();

  • Hydra
  • Registratie: September 2000
  • Laatst online: 06-10 13:59
Euh, hoe kom je er precies bij dat je die extensie er niet aan moet plakken dan?

https://niels.nu


Verwijderd

Topicstarter
Dat gebeurt een stukje verder in de code :P
Maar het is nu gelukt, hij werkt.
Bedankt voor de info, uiteindelijk was een juiste conversie met check de oplossing.

  • Merethil
  • Registratie: December 2008
  • Laatst online: 02:13
Verwijderd schreef op maandag 10 maart 2014 @ 14:21:
Dat gebeurt een stukje verder in de code :P
Maar het is nu gelukt, hij werkt.
Bedankt voor de info, uiteindelijk was een juiste conversie met check de oplossing.
Wat dus inhoudt dat je String toch niet 100% was. Wat is de uiteindelijke conversie die je hebt gedaan? (Gewoon voor mensen die toevallig een soortgelijk probleem tegenkomen en de search gebruiken op jouw keywords).

En hoe heb je je uiteindelijk probleem met ".ini" aan 't einde van je String opgelost? Ook voor dezelfde reden als hierboven.

Verwijderd

Topicstarter
Het stukje .ini werkt als volgt,
C#:
1
2
3
4
5
6
7
8
9
10
11
12
string s = "";
try
{
   s = UserPath + "\\" + dataGridView1.SelectedRows[0].Cells[0].Value.ToString();
 }
catch
{

}
if (s != "")
{
   iniContoller.IniFile(s + "\\Depths.ini"); 

Eerst wordt een deel van het path gemaakt, Als de grid leeg is geeft hij een error en blijft s dus leeg.
Als s niet leeg is wordt de inifile toegevoegd en kan de rest van de code runnen.

Die check is als volgt, (Er zijn waarschijnlijk nog 100x betere manieren dan met een try catch)
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public int IniReadInt(string Section, string Key)
        {
            StringBuilder temp = new StringBuilder(255);
            int i = GetPrivateProfileString(Section, Key, "", temp, 255, this.path);

            int o = 0;
            try
            {
                o = Convert.ToInt32(temp.ToString());
            }
            catch
            {

            }


            return o;

        }


Zie dit voor de conversie,
MSDN: How to: Determine Whether a String Represents a Numeric Value (C# Programming Guide)

[ Voor 8% gewijzigd door Verwijderd op 10-03-2014 14:35 ]


  • Hydra
  • Registratie: September 2000
  • Laatst online: 06-10 13:59
Sowieso zou je eens moeten gaan kijken naar 't gebruik van een database i.p.v. alles zo op 't filesysteem op te slaan.

https://niels.nu


  • Merethil
  • Registratie: December 2008
  • Laatst online: 02:13
Verwijderd schreef op maandag 10 maart 2014 @ 14:33:
Het stukje .ini werkt als volgt,
C#:
1
2
3
4
5
6
7
8
9
10
11
12
string s = "";
try
{
   s = UserPath + "\\" + dataGridView1.SelectedRows[0].Cells[0].Value.ToString() + ".ini";
 }
catch
{

}
if (s != "")
{
   iniContoller.IniFile(s + "\\Depths.ini"); 

Eerst wordt een deel van het path gemaakt, Als de grid leeg is geeft hij een error en blijft s dus leeg.
Als s niet leeg is wordt de inifile toegevoegd en kan de rest van de code runnen.

Die check is als volgt, (Er zijn waarschijnlijk nog 100x betere manieren dan met een try catch)
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public int IniReadInt(string Section, string Key)
        {
            StringBuilder temp = new StringBuilder(255);
            int i = GetPrivateProfileString(Section, Key, "", temp, 255, this.path);

            int o = 0;
            try
            {
                o = Convert.ToInt32(temp.ToString());
            }
            catch
            {

            }


            return o;

        }
Dus nu geef je altijd 0 terug als je in een error loopt bij je toInt functie? Eventuele afhandeling kan natuurlijk in je catch, kan ook wel mooi zijn (kan je direct terugzien of 't vaak fout gaat en waarop).
De try/catch van de .ini fix is niet nodig lijkt me, kan je net zo goed een if/else van maken of eventueel een extra check op null en empty waarden.

Verwijderd

Topicstarter
Een database is eventueel later nog mogelijk, maar het is nu zaak dat het asap werkt.

Het is misschien beter inderdaad om de return standaard null te maken.

  • Merethil
  • Registratie: December 2008
  • Laatst online: 02:13
Verwijderd schreef op maandag 10 maart 2014 @ 14:40:
Een database is eventueel later nog mogelijk, maar het is nu zaak dat het asap werkt.

Het is misschien beter inderdaad om de return standaard null te maken.
Bij een int liever niet, dat gaat al helemaal niet werken.
Wat me vooral opvalt is dat je er try/catch overheen knalt zonder wat te catchen noch af te vangen en 0 retourneert alsof dat een goede waarde is voor wat je ermee wilt doen. Nu kan het zijn dat een waarde, die eigenlijk goed zou moeten zijn maar per ongeluk een spatie of leesteken bevat, automatisch "0" wordt. Lijkt me niet een fijne manier van datamanipulatie.

Een betere oplossing is proberen de String die je omzet te trimmen en eventuele leestekens die je verwacht te vervangen (indien nodig). Mocht de translatie String->int dan nog niet lukken, kan je een error/warning gooien, misschien zelfs met regelnummer o.i.d.
De volgende persoon die hieraan werkt zal je iig dankbaar zijn ;)

Verwijderd

Topicstarter
Ja, je hebt gelijk.
Misschien een error message die verteld dat de conversie niet is gelukt en wat de string dan is.

  • diabolofan
  • Registratie: Mei 2009
  • Laatst online: 13-11 08:57
Kijk ook eens naar Int32.TryParse

MSDN: Int32.TryParse Method (System)

  • Merethil
  • Registratie: December 2008
  • Laatst online: 02:13
Verwijderd schreef op maandag 10 maart 2014 @ 14:52:
Ja, je hebt gelijk.
Misschien een error message die verteld dat de conversie niet is gelukt en wat de string dan is.
Zoiets, eventueel de locatie van het mislukte item (of de naam van de property of... Iets in die richting)

Verwijderd

Topicstarter
Die tryparse had ik inderdaad ook gevonden.
Error message is nu,
MessageBox.Show("Error converting inidata to integer" + Environment.NewLine + "Key,(" + Key + ")" + Environment.NewLine + "Section,(" + Section + ")" + Environment.NewLine + "Value,(" + temp + ")");

[ Voor 13% gewijzigd door Verwijderd op 10-03-2014 15:00 ]


  • Cloud
  • Registratie: November 2001
  • Laatst online: 03-11 10:25

Cloud

FP ProMod

Ex-moderatie mobster

Verwijderd schreef op maandag 10 maart 2014 @ 14:58:
Die tryparse had ik inderdaad ook gevonden.
Error message is nu,
MessageBox.Show("Error converting inidata to integer" + Environment.NewLine + "Key," + Key + " Section," + Section + " Value," + temp);
Kan nog iets mooier:
C#:
1
2
MessageBox.Show(
String.Format("Error converting inidata to integer{0}Key,{1} Section,{2} Value,{3}", Environment.NewLine, Key, Section, temp);

(typfouten voorbehouden)

MSDN: String.Format is veel mooier voor het samenstellen van dit soort foutmeldingen. Scheelt je een hoop geknoei met +'en en alle aanhalingstekens :) Het is een stuk leesbaarder.

Never attribute to malice that which can be adequately explained by stupidity. - Robert J. Hanlon
60% of the time, it works all the time. - Brian Fantana


Verwijderd

Topicstarter
Zeker,

Al doende leert men :P

Helemaal mooi is dit,

System.Windows.Forms.MessageBox.Show(String.Format("Key,({1}) {0}Section,({2}) {0}Value,({3})", Environment.NewLine, Key, Section, temp), "Error converting inidata to integer");

[ Voor 76% gewijzigd door Verwijderd op 10-03-2014 15:07 ]


  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 06-09 17:51
FYI; (even iets heel anders...) Je weet hopelijk ook dat een schuld in het engels een 'debt' is en niet een 'depth'?

Verwijderd

Topicstarter
Ja, typo depth is namelijk diepte :P
Pagina: 1