• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Visual Studio Windows Forms

Object Storage Arubacloud
0 głosów
654 wizyt
pytanie zadane 5 listopada 2019 w C# przez Aneczka_1511 Nowicjusz (150 p.)

Cześć :)

Piszę program w Visual Studio Windows Forms w c#. Mój problem wygląda tak: użytkownik ma możliwość wyboru z listy rozwijanej 3 opcji text, plik mp3 oraz plik multimedialny. Lista rozwijana jest połączona z jednym buttonem. Program ma działać w ten sposob ze po wybraniu text z listy i kliknieciu buttona wyswietli sie nowy textbox a po kliknieciu pliku mp3 bądz pliku multimedialnego wyswietli się explorator plików w którym można wybrać jakiś plik a ścieżka tego pliku zapisze się w następnym nowym textboxie. (kazda z 3 opcji może być wybrana ile razy sie chce i w obojetnej kolejnosci) Wszytkie textboxy wybrane z (text,plik multimedialny, plik mp3) muszą sie wyswietlic na formatce ładnie pod sobą. Wszystko tak naprawdę działą oprócz tego, że po wybraniu pliku multimedialnego lub pliku mp3 wyświetla się explorator plików ale ścieżka nie chce się zapisać do textboxa!!!.  Wiem,że dzieje sie tak bo w kodzie nie mam odwołania do konkretnego textboxa w którym ta ścieżka ma się zapisać, a nie mogę zrobić odwołania do konkretnego textboxa ponieważ mają się one generowac automatycznie.

Z góry dziękuję za wszelką pomoc! :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;
using System.Data.SqlClient;
using System.IO;

namespace Workout
{
    public partial class Configuration : Form
    {
        public Configuration()
        {
            InitializeComponent();
        }

        private void CheckBox1_CheckedChanged(object sender, EventArgs e)
        {
            label4.Visible = true;
            label5.Visible = true;
            comboBox1.Visible = true;
            button1.Visible = true;
        }

        private void Configuration_Load(object sender, EventArgs e)
        {
            comboBox1.Items.Add("Text");
            comboBox1.Items.Add("Plik mp3");
            comboBox1.Items.Add("Plik multimedialny");
        }
        OpenFileDialog ofd = new OpenFileDialog();
        int A = 1;
        private void Button1_Click(object sender, EventArgs e)
        {

            if ((string)comboBox1.SelectedItem == "Text")
            {
                AddNewTextBox();
            }
            else if (ofd.ShowDialog() == DialogResult.OK & (string)comboBox1.SelectedItem == "Plik multimedialny" || (string)comboBox1.SelectedItem == "Plik mp3")
            {
               AddNewTextBox();
            ???TextBox.Text = ofd.SafeFileName;  // Ta linijka powinna zapisac scieżkę do nowo powstałego textboxa

                 
-------Ten fragment kodu ponizej dziala poprawnie w przypadku gdy na formatce znajduje sie textbox

                  //textBox3.Text = ofd.SafeFileName;
                 //textBox1.Enabled = true;
               
                

            }
           
        }

        public System.Windows.Forms.TextBox AddNewTextBox()

        {
            System.Windows.Forms.TextBox txt = new System.Windows.Forms.TextBox();
    
            this.Controls.Add(txt);
            txt.Top = 255 + A * 30;
            txt.Left = 67;
            txt.Text = "Enter Text" + this.A.ToString();
            A = A + 1;
            return txt;
            


        }
    }
}

Z góry dziękuję za wszelką pomoc! :D 

1 odpowiedź

0 głosów
odpowiedź 5 listopada 2019 przez reaktywny Nałogowiec (40,930 p.)
wybrane 6 listopada 2019 przez Aneczka_1511
 
Najlepsza

Dawno nie używałem Windows Forms, ale napisałbym coś w stylu:

TextBox tb = new TextBox();
tb.Location = new Point(187, 51); // Współrzędne TextBoxa na formie
this.Controls.Add(tb);
tb.Text = ofd.SafeFileName; 

Powyżej ogólny przypadek, ale u Ciebie będzie:

TextBox tb = AddNewTextBox();

tb.Text = ofd.SafeFileName;

Ten drugi kod jest właściwy w Twoim przypadku.

Wstawiasz zamiast linii 47 i 48.

komentarz 5 listopada 2019 przez Aneczka_1511 Nowicjusz (150 p.)
Dziękuję za odpowiedz

Kod działą i tworzy się nowy textbox z zapisaną ścieżką. Jednak chodzi mi o to żeby podany textbox korzystał z lokalizacji podanej w funkcji AddNewtextbox i tworzył następnego textboxa jeden pod drugim
komentarz 5 listopada 2019 przez reaktywny Nałogowiec (40,930 p.)
edycja 5 listopada 2019 przez reaktywny
using Windows.Forms.TextBox;

namespace Workout
{
    public partial class Configuration : Form
    {
        int A = 0;

        public Configuration()
        {
            InitializeComponent();
            A = 1;
		}
			
        private void CheckBox1_CheckedChanged(object sender, EventArgs e)
        {
		    
            label4.Visible = true;
            label5.Visible = true;
            comboBox1.Visible = true;
            button1.Visible = true;
        }
 
        private void Configuration_Load(object sender, EventArgs e)
        {
            comboBox1.Items.Add("Text");
            comboBox1.Items.Add("Plik mp3");
            comboBox1.Items.Add("Plik multimedialny");
        }

        private void Button1_Click(object sender, EventArgs e)
        {
     		OpenFileDialog ofd = new OpenFileDialog();
            A++;
            int yPos = 255 + A * 30;
			if ((string)comboBox1.SelectedItem == "Text")
            {
                TextBox tb0 = AddNewTextBox("Enter Text " + this.A.ToString(), yPos);
				this.Controls.Add(tb0);
            }
            else if (ofd.ShowDialog() == DialogResult.OK & (string)comboBox1.SelectedItem == "Plik multimedialny" || (string)comboBox1.SelectedItem == "Plik mp3")
            { 
				TextBox tbn = AddNewTextBox(ofd.SafeFileName, yPos);			
				this.Controls.Add(tbn);
            }
        }
 
        public TextBox AddNewTextBox(string tbText, int yPos)
        {
            TextBox txt = new TextBox();            
            txt.Top = yPos;
            txt.Left = 67;
            txt.Text = tbText;
            return txt;
        }
    }
}

Obliczanie współrzędnej y ( int yPos = 255 + A * 30; ) można zrobić tu i tam. Dowolnie.

Czyli może zostać po staremu.

komentarz 6 listopada 2019 przez Aneczka_1511 Nowicjusz (150 p.)
Wszystko działa! Dziękuję za pomoc :D
komentarz 6 listopada 2019 przez reaktywny Nałogowiec (40,930 p.)
No to cieszę się, bo pisałem trochę "w ciemno" w edytorze Notepad++, nie mam VS.
komentarz 12 listopada 2019 przez Aneczka_1511 Nowicjusz (150 p.)

Cześć,

Mam jeszcze jedno pytanie z którym już trochę się męczę. Chodzi o to że teraz wszystkie te informacje z textboxów muszę zapisać w pliku tekstowym jeden pod drugim tak żeby można je było z powrotem wgrać. Wszystkie te textboxy to plik konfiguracyjny. I zapisywanie działa jak mam textboxa na formatce, a te tutaj są tworzone z funkcji i nie wiem jak się do nich odwołać ;/

 

 

using System;
using System.Windows.Forms;
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.IO;

namespace Workout
{
    public partial class Configuration : Form
    {
        int A = 0;

        public Configuration()
        {
            InitializeComponent();
            A = 1;
            
        }

        private void CheckBox1_CheckedChanged(object sender, EventArgs e)
        {

            label4.Visible = true;
            label5.Visible = true;
            comboBox1.Visible = true;
            button1.Visible = true;
            label6.Visible = true;
            button3.Visible = true;
            comboBox2.Visible = true;
            button2.Visible = true;
            button5.Visible = true;
        }

        

        private void Configuration_Load(object sender, EventArgs e)
        {
            comboBox1.Items.Add("Text");
            comboBox1.Items.Add("Plik mp3");
            comboBox1.Items.Add("Plik multimedialny");
            comboBox2.Items.Add("1");
            comboBox2.Items.Add("2");
            comboBox2.Items.Add("3");
            comboBox2.Items.Add("4");
            comboBox2.Items.Add("5");
            comboBox2.Items.Add("6");
            comboBox2.Items.Add("7");
            comboBox2.Items.Add("8");
            comboBox2.Items.Add("9");


        }

        private void Button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            A++;
            int yPos = 175 + A * 55;
            

            if ((string)comboBox1.SelectedItem == "Text")
            {
                TextBox tb0 = AddNewTextBox(ofd.SafeFileName, yPos);
                this.Controls.Add(tb0);
                tb0.Multiline = true;
                tb0.Width = 300;
                tb0.Height = 50;
               
            }
            else if (ofd.ShowDialog() == DialogResult.OK & (string)comboBox1.SelectedItem == "Plik multimedialny" || (string)comboBox1.SelectedItem == "Plik mp3")
            {
                TextBox tbn = AddNewTextBox(ofd.SafeFileName, yPos);
                this.Controls.Add(tbn);
                tbn.Multiline = true;
                tbn.Width = 300;
                tbn.Height = 30;


            }
        }

        

        public TextBox AddNewTextBox(string tbText, int yPos )
        {
            TextBox txt = new TextBox();
            txt.Top = yPos;
            txt.Left = 67;
            txt.Text = tbText;
            
            return txt;
           
        }


        private void Button5_Click(object sender, EventArgs e)
        {



            SaveFileDialog sfd = new SaveFileDialog();

            
            

            sfd.InitialDirectory = @"C:\";
            sfd.RestoreDirectory = true;
            sfd.FileName = "*.txt";
            sfd.DefaultExt = "txt";
            sfd.Filter = "txt files (*.txt) | *.txt";

            if (sfd.ShowDialog() == DialogResult.OK)
            {
                Stream fileStream = sfd.OpenFile();
                StreamWriter sw = new StreamWriter(fileStream);

                sw.Write(textBox1.Text); // tutaj nie wiem jak zadeklarowac te wszystkie textboxy


                sw.Close();
                fileStream.Close();
                
                

            }
            
        }



    }
}

 

komentarz 12 listopada 2019 przez reaktywny Nałogowiec (40,930 p.)
// To można przenieść do metody AddNewTextBox
      tbn.Multiline = true;
      tbn.Width = 300;
      tbn.Height = 30;

Możesz zrobić dwie rzeczy:

1) To o co teraz pytasz - czyli odwoływąć się do programowo utworzonych Text Boxów, żeby to zrobić możesz w linii 17 utworzyć deklarację listy albo tablicy textboxów, a w metodzie Button1_Click(...) nowo tworzone textboxy dodawać do tej listy czy tablicy. I na końcu w pętli wyciągnąć dane z listy/tablicy textboxów.

albo:

2) Trochę prościej, ale nie wiem czy to spełnia warunki zadania / projektu.

W czasie tworzenia nowych TextBoxów zapamiętywać tekst (czyli arg. string tbText przekazywany do metody AddNewTextBox()) w  jakiejś liście stringów... Na końcu wystarczy zapisać listę stringów do "pliku konfiguracyjnego". Nie wiem czy jednak takie coś Ciebie urządza.

---

Można jeszcze tak:

foreach (TextBox tb in this.Controls.OfType<TextBox>()) 
{
  ........ = tb.Text;
}

Ale wtedy przelatujesz po dokładnie wszystkich Text Boxach na Formie, a nie zawsze jest to pożądane.

 

 

 

komentarz 13 listopada 2019 przez Aneczka_1511 Nowicjusz (150 p.)
edycja 13 listopada 2019 przez Aneczka_1511
Zadeklarowałam tablice : TextBox[] boxes = {}; nie wiem czy dobrze i w jaki sposób dodać te textboxy do tablicy z metody Button1_Click(...)? Wszystkie metody Add. itp mi nie działają. I o co chodzi z pętlą? Zapisanie tych informacji musi się odbyć po wciśnięciu buttona w którym dałam metode SaveFileDialog.
komentarz 13 listopada 2019 przez reaktywny Nałogowiec (40,930 p.)

// To na początku - linia ok. 17-ej
List<TextBox> tbList = new List<TextBox>();

// W metodzie Button1_Click(....)

dodaj:

this.tbList.Add( tb0 );

oraz

this.tbList.Add( tbn );

zaraz za wpisami:

this.Controls.Add(tb0);

i

this.Controls.Add(tbn);


Otrzymasz listę TextBoxów o nazwie: tbList

I finalnie przelatujesz po niej (po liście) pętlą np. foreach czy for, wyciągając odpowiendnie dane do zapisania w pliku.


Powodzenia!

Podobne pytania

0 głosów
1 odpowiedź 104 wizyt
pytanie zadane 29 marca 2019 w C# przez rav89lodz Użytkownik (590 p.)
0 głosów
0 odpowiedzi 168 wizyt
0 głosów
1 odpowiedź 630 wizyt

92,539 zapytań

141,382 odpowiedzi

319,481 komentarzy

61,928 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...