Chci geek triko! Chci geek triko!
Extra 10 % bodů navíc a tričko zdarma při zadání kódu "TRIKO10"
Avatar
Michal Pflegshörl:13. září 12:44

Ahoj všem,
Tímto kódem

Form_Novy Novy = new Form_Novy();
Novy.Start();

Otevírám následující formulář

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

namespace Projekt
{
    string[] VybraneSoubory;

    public partial class Form_Novy : Form
    {
        public void Start()
        {
            System.Threading.Tasks.Task.Run(() =>
            {
                this.ShowDialog();
            });
        }

        public Form_Novy()
        {
            InitializeComponent();
        }

        private void button_VyberSoubor_Click(object sender, EventArgs e)
        {
            OpenFileDialog VyberSouboru = new OpenFileDialog();
            VyberSouboru.Title = "Vyberte soubor";
            VyberSouboru.Multiselect = true;
            if (VyberSouboru.ShowDialog() == DialogResult.OK)
            {
                VybraneSoubory = VyberSouboru.FileNames);
            }
        }

        private void button_Zpracuj_Click(object sender, EventArgs e)
        {
            .....
        }
    }
}

Bohužel řádek if (VyberSouboru­.ShowDialog() == DialogResult.OK) nejen, že nezobrazí výběr souborů, ale způsobí zavření Form_Novy.

Zkusil jsem: Všechno možné

Chci docílit: Potřebuji aby se v takto otevřeném Form_Novy zobrazilo okno pro výběr souborů.
Formulář otevírám pomocí metody Start protože potřebuji docílit toho, že mezitím co Form_Novy bude provádět metodu button_Zpracuj_Click může uživatel dále bez omezení pracovat ve formuláři, ze kterého byl Form_Novy otevřen.

 
Odpovědět 13. září 12:44
Avatar
Odpovídá na Michal Pflegshörl
Michal Štěpánek:13. září 15:43

Podle mě pleteš dohromady "otevírání" dialogu a "výběr" tlačítka. Myslím, že ShowDialog() se nemůže spojovat s DialogResult.OK.

Nahoru Odpovědět  -1 13. září 15:43
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Jiří Hlaváček:14. září 0:56

No mně přijde divný hlavně to, že z jednoho vlákna otevíráš druhý a v tom druhým vlákně použiješ

this.ShowDialog();

čímž používáš metodu objektu vytvořeného v tom prvním. Vždycky, když jsem pracoval nebo experimentoval s vlákny, tak s tím byl problém (Cross Threading) a ne vždycky to Visual Studio hlásilo jako chybu - někdy to jen spadlo.
Nebude lepší v druhým vlákně dělat to zpracování, ať už to je cokoliv?

 
Nahoru Odpovědět 14. září 0:56
Avatar
Luboš Satik Běhounek
Autoredaktor
Avatar
Luboš Satik Běhounek:14. září 2:11

Presne tak, mas tam bordel ve vlaknech. Ten kod v metode start uprav a vyhod tam ten threading task.

Pokud by sis ten kod co zavre okno hodil do try/catch, videl bys, ze to tam hazi vyjimku. Muzes si ji i aktivovat v Debug->Windows->Exception Settings a tam zaskrtnout celou vetev Common Language Runtime Exceptions.

Pripadne to cely muzes prekopat a misto volani Start jen rovnou na instanci tohohle formu zavolas nazevinstance­.ShowDialog() .

Pokud bys chtel mit vic logiky v metode start, tak pak jen pouzijes OnShow() u formulare.

Nahoru Odpovědět 14. září 2:11
https://www.facebook.com/peasantsandcastles/
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 4 zpráv z 4.