C# Windows Forms, Button trigger.

Permalänk
Medlem

C# Windows Forms, Button trigger.

Tjabba!
Behöver hjälp med att få en viss kod att köras när användaren trycker på en knapp i formen.
Problemet är att jag inte kan skicka mina metoder i själva BtnCheckUser_click utan måste lösa det på annat vis då datan jag tar emot och behandlar sker i en TCP läsare.

Det jag vill lösa är att få ut min validUser.ToString() i en textbox från SplitNosData metoden NÄR en användare klickar på en knapp i programmet. Eller på annat sättt. Tack!

using System; using System.IO; using System.Net; using System.Net.Sockets; 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 Guldkortet3 { public partial class TcpAsyncServerForm : Form { private int port = 12345; private TcpClient client; private TcpListener listener; bool button; int counter; User user; List<User> userData; ValidUser validUser; List<ValidUser> validUserList; public TcpAsyncServerForm() { InitializeComponent(); StreamReaderUserData(); StreamReaderCardData(); } private void BtnStartServer_Click(object sender, EventArgs e) { try { BtnStartServer.Enabled = false; StartListener(); } catch (Exception error) { MessageBox.Show(error.Message, this.Text); return; } } private async void StartListener() { try { listener = new TcpListener(IPAddress.Any, port); listener.Start(); client = await listener.AcceptTcpClientAsync(); } catch (Exception error) { MessageBox.Show(error.Message, this.Text); return; } StartReader(client); } private async void StartReader(TcpClient c) { string nosData; byte[] inputData; int n; try { inputData = new byte[1024]; n = await c.GetStream().ReadAsync(inputData, 0, inputData.Length); nosData = Encoding.Unicode.GetString(inputData, 0, n); } catch (Exception error) { MessageBox.Show(error.Message, this.Text); return; } StartReader(c); TbUserToString.Clear(); SplitNosData(nosData); } public void SplitNosData(string nosData) { counter = 0; string[] vector; List<string[]> vectorList = new List<string[]>(); validUserList = new List<ValidUser>(); userData = new List<User>(); // Datan från NOS_export, splittas till två strängar och läggs i en vektorlista. vector = nosData.Split(new string[] { "-" }, StringSplitOptions.None); vectorList.Add(vector); // FÖR VARJE data i listan // SÅ tilldelas ett indexvärde till en nyskapad user från NOS-datan. // Denna data ska jämföras med en existerande = ValidUser lista. LbNosData.Items.Clear(); foreach (string[] vs in vectorList) { user = new User(); userData.Add(user); user.AnvändarNummer = vs[0]; user.KortNummer = vs[1]; LbNosData.Items.AddRange(vs); } // OM det finns en användare i kundlistan med samma A-serienummer som skickas från NOS_export. // SÅ skapas det en ny användare. // ANNARS meddelas att ingen användare hittats. foreach (string[] sUser in StreamReaderUserData()) { foreach (User u in userData) { if (u.AnvändarNummer == sUser[0]) { validUser = new ValidUser(); validUserList.Add(validUser); validUser.AnvändarNummer = sUser[0]; validUser.Namn = sUser[1]; validUser.Ort = sUser[2]; TbUserToString.Clear(); TbUserToString.AppendText(validUser.ToString()); if (u.KortNummer == "K999999999") { if (u.AnvändarNummer == sUser[0]) { TbUserToString.Clear(); TbUserToString.AppendText(sUser[1] + " (" + sUser[0] + ")" + "\r\nDu har tyvärr ett felaktigt kortnummer."); } } } else if (u.AnvändarNummer == "A9999999" && u.KortNummer == "K999999999") { TbUserToString.Clear(); TbUserToString.AppendText("Tyvärr finns ingen användare."); } else if (u.AnvändarNummer == "A9999999" && u.KortNummer != "K999999999") { TbUserToString.Clear(); TbUserToString.AppendText("Tyvärr finns ingen användare."); } } } // OM en användare har fel anv nummer. try { if (user.AnvändarNummer == "A9999999") { MessageBox.Show("Användaren finns inte i databasen", Text.Insert(19, "-error 404")); } } catch (Exception) { return; } } public List<string[]> StreamReaderUserData() { string item = ""; string[] vector; List<string> userDataSaver = new List<string>(); List<string[]> userVector = new List<string[]>(); StreamReader reader = new StreamReader("kundlista.txt", Encoding.Default, true); if (File.Exists("kundlista.txt")) { while ((item = reader.ReadLine()) != null) { userDataSaver.Add(item); } foreach (string s in userDataSaver) { vector = s.Split(new string[] { "###" }, StringSplitOptions.None); userVector.Add(vector); } } reader.Close(); return userVector; } public List<string[]> StreamReaderCardData() { string item = ""; string[] vector; List<string> cardSaver = new List<string>(); List<string[]> cardVector = new List<string[]>(); StreamReader reader = new StreamReader("kortlista.txt", Encoding.Default, true); if (File.Exists("kortlista.txt")) { while ((item = reader.ReadLine()) != null) { cardSaver.Add(item); } foreach (string s in cardSaver) { vector = s.Split(new string[] { "###" }, StringSplitOptions.None); cardVector.Add(vector); } } reader.Close(); return cardVector; } private void BtnCheckUser_Click(object sender, EventArgs e) { BtnCheckUser.Enabled = false; button = true; } public void ButtonEnabled() { BtnCheckUser.Enabled = true; button = false; } } public class User { public string AnvändarNummer { get; set; } public string KortNummer { get; set; } public override string ToString() { return "Anv: " + AnvändarNummer + " Kort nr: " + KortNummer; } } public class ValidUser : User { public string Namn { get; set; } public string Ort { get; set; } public string Guldkort { get; set; } public override string ToString() { return "Grattis " + Namn + ". Du vann det exklusiva " + Guldkort + " kortet. \r\nDu kan hämta det i din lokala spelbutik i " + Ort; } } }

Permalänk
Medlem

@virree97:

Det ser ut som att du kör igång TCP-avläsningen så fort användaren trycker på BtnStartServer_Click() som i sin tur kallar på StartListener() som i sin tur kallar på StartReader(client). Det är väl detta flöde som känns lite felaktigt baserat på det du önskar.

Du borde istället spara undan klienten som skapas i StartListener() och inte kalla på StartReader(client) här.

Sen när användaren trycker på BtnCheckUser_click() så kallar du på StartReader(client).

Alternativt så låter du bara client skapas varje gång du ska prata med TCP-lyssnaren. Men återigen så ska du inte göra det på en gång utan väl när användaren trycker på BtnCheckUser_click().

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?

Permalänk
Medlem

För mig är det mer hanterbart om man använder eventbaserade objekt när man kör multitrådad nätverkskommunikation.

https://codereview.stackexchange.com/questions/196690/event-b...

Permalänk
Medlem
Skrivet av Leedow:

@virree97:

Det ser ut som att du kör igång TCP-avläsningen så fort användaren trycker på BtnStartServer_Click() som i sin tur kallar på StartListener() som i sin tur kallar på StartReader(client). Det är väl detta flöde som känns lite felaktigt baserat på det du önskar.

Du borde istället spara undan klienten som skapas i StartListener() och inte kalla på StartReader(client) här.

Sen när användaren trycker på BtnCheckUser_click() så kallar du på StartReader(client).

Alternativt så låter du bara client skapas varje gång du ska prata med TCP-lyssnaren. Men återigen så ska du inte göra det på en gång utan väl när användaren trycker på BtnCheckUser_click().

Skrivet av Mordekai:

För mig är det mer hanterbart om man använder eventbaserade objekt när man kör multitrådad nätverkskommunikation.

https://codereview.stackexchange.com/questions/196690/event-b...

Tack så mycket! Ni hjälpte mig på traven, grymt!