C# - DataGridView + float – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

C# - DataGridView + float – .NET – Fórum – Programujte.comC# - DataGridView + float – .NET – Fórum – Programujte.com

 

BDS+3
Věrný člen
8. 6. 2016   #1
-
0
-

Zdravím vás, potřeboval bych poradit. Snažím se vytvořit něco podobného jako je tabulka v Excelu, jen s tím, že budu pracovat pouze s čísly. Udělal jsem si zkušební projekt: 

    public partial class Form1 : Form
    {
        List<MyModel> lst = new List<MyModel>();
        public Form1()
        {
            lst.Add(new MyModel(1.0f, 1.2f, 2.3f));
            lst.Add(new MyModel(2.0f, 1.4f, 2.3f));
            lst.Add(new MyModel(3.0f, 1.6f, 4.3f));
            lst.Add(new MyModel(4.0f, 1.8f, 6.3f));
            lst.Add(new MyModel(5.0f, 2.0f, 8.3f));
            lst.Add(new MyModel(6.0f, 2.0f, 8.4f));
            lst.Add(new MyModel(7.0f, 2.0f, 8.5f));
            InitializeComponent();
            datagridview.DataSource = lst;
        }
    }

    public class MyModel
    {        
        [DisplayName("Value A")]
        public float A { get; set; }
        [DisplayName("Value B")]
        public float B { get; set; }
        [DisplayName("Value C")]
        public float C { get; set; }

        public MyModel(float a, float b, float c)
        {            
            A = a;
            B = b;
            C = c;
        }
    }

ale nevím, jak ošetřit vstup. Aby nevyskakovala žádná chybová hlášení, pouze aby se při vložení nesprávného formátu čísla, zachovala původní hodnota.

Nahlásit jako SPAM
IP: 185.69.69.–
W11 :)
ing0
Stálý člen
9. 6. 2016   #2
-
0
-

#1 BDS
jednoducho v udalosti pred zacatim uprav bunky si uloz do premennej obsah a v udalosti po ukonceni uprav kontroluj format a ak nesedi tam vloz obsah premennej...

V C# neviem presne nazvy udalosti ale malo by to byt rovnake ako vo VB, kde to je DataGridView.CellBeginEdit a DataGridView.CellEndEdit

Nahlásit jako SPAM
IP: 213.81.137.–
V programovani som uplna lama, ale som samouk tak sa nesmejte
Ovrscout
~ Anonymní uživatel
113 příspěvků
9. 6. 2016   #3
-
+1
-
Zajímavé
BDS +

#2 ing
myslím že takhle v událostech to s databindingem nebude fungovat.

#1 BDS
Nejspíše to nebude to úplně "správné" řešení s C# bindingem zas tak moc zkušeností nemám, ale možná stojí za pokus, nebo tě to alespoň někam posune:
Změnit get/set na typ hodnoty string, a definovat private proměnou float.
Do Get/Set doplnit konverzi  float<->string pomocí ToString, TryParse nebo taknějak.
Hodnotu proměnné v setteru přepsat jen pokud se konverze z textu podaří.
Nejsem si jist zda se v tom případě původní hodnota prokreslí zpět na Formulář, pokud ne tak by se musel vyměnit list<> za BindingList<> a do MyModel implementovat INotifyPropertyChanged, Do setteru pak při chybě konverze přidat volání PropertyChanged.

Nahlásit jako SPAM
IP: 193.165.79.–
Ovrscout
~ Anonymní uživatel
113 příspěvků
9. 6. 2016   #4
-
0
-

#2 ing
hmm, projistotu jsem rychle zagooglil ale nic moc.
Možná máš přeci jen pravdu a fungovat by to mohlo. Stojí to za vyzkoušení.

Nahlásit jako SPAM
IP: 193.165.79.–
BDS+3
Věrný člen
9. 6. 2016   #5
-
0
-

#2 ing
to já právě nevím jak to ošetřit. Jediné co se mě povedlo, tak přes CellValidating zkontrolovat vstup a pokud je neplatný, tak přes Cancel to zastavit, ale problém je v tom, že ta buňka zůstane čekat na platný vstup, takže nejde ani označit jiná.. to je uživatelsky dost nepříjemné.

Nedaří se mě najít na netu, žádnou kompletní ukázku, takhle jsem nad tím seděl několik hodin a pořád jsem na to nepřišel.

#3 Ovrscout dát tam vlastnost jako string mě vůbec nenapadlo, je to geniální :) a asi nejjednodušší řešení

Takže: 

    public class MyModel
    {
        float a, b, c;

        public MyModel(float a, float b, float c)
        {
            this.a = a;
            this.b = b;
            this.c = c;
        }
        
        [DisplayName("Value A")]
        public string A
        {
            get
            {
                return string.Format("{0:0.##}", a);
            }
            set
            {
                float f;
                if(float.TryParse(value, out f))a = f;
            }
        }
...

ale přijde mi to trochu školácké řešení - protože si myslím, že to jde nějak ošetřit přes události toho gridu možná jak píše ing přes Begin/EndEdit, ale nevím jak na to. Taky jsem narazil na "atribut" vlastnosti [TypeConverter()], nemůže mi to taky nějak pomoct? Takže vlákno jako vyřešené, zatím nebudu označovat. Ale každopádně díky moc, za reakce. 

Budu moc rád za případné další nápady a nejlépe ukázky.

Nahlásit jako SPAM
IP: 185.69.69.–
W11 :)
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 11 hostů

Podobná vlákna

Datagridview — založil vlak

DataGridView — založil Turbo1

Refresh datagridview — založil Petr

Filtr DataGridView — založil Jorya

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý