Hirdetés
Új hozzászólás Aktív témák
-
dqdb
nagyúr
válasz t-shirt #8650 üzenetére
A soros port egy olyan állatfajta, amit egyszerre csak egy példányban lehet megnyitni, ráadásul full duplex átvitelre képes, így azon az egy példányon keresztül mehet a küldés-fogadás.
Emellett érdemes rászokni a
using
használatára olyan esetben, amikorIDisposable
interfészt megvalósító osztállyal dolgozol, mint aSerialPort
, hogy exception esetében is garantáltan meghívódjon aDispose
metódus.Vakon belemódosítva valami ilyesmi lenne:
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
using (var port = new SerialPort("COM4"))
{
port.BaudRate = 9600;
port.Parity = Parity.None;
port.StopBits = StopBits.One;
port.DataBits = 8;
port.Handshake = Handshake.None;
port.RtsEnable = true;
port.DataReceived += Port_DataReceived;
port.Open();
Console.WriteLine("Küldj üzenetet a COM4 portra:");
while (!(Console.KeyAvailable && Console.ReadKey(true).Key == ConsoleKey.Escape)) {
WriteData(port, Console.ReadLine());
}
}
private static void WriteData(SerialPort port, string readLine)
{
port.WriteLine(readLine);
}
private static void Port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
var sp = (SerialPort)sender;
string dataReceived = sp.ReadExisting();
Console.WriteLine("A vissza jövö uzenet a COM4 port ra: " + dataReceived);
}
}
}tAm6DAHNIbRMzSEARWxtZW50ZW0gdmFka5RydIJ6bmkuDQoNClOBc4Ek
-
t-shirt
veterán
Sikerült megírni amit szerettem volna, de nem lett túl elegáns, ami valószínűleg csak az én járatlanságomnak köszönhető.
A port kommunikáció elvár működése: a „munkagép” küld egy üzenetet a soros porton keresztül a PC-nek miszerint várja a következő adatot. A program ezt az eseményt érzékelve egy tömbből elküldi a következő adatot és várja az újabb adatkérést.A gondom azzal volt, hogy a példa programban amit sikerült életre kelteni a küldés és fogadás külön metódus, és nem sikerült egybe gyúrnom a kettőt. Szerintem az egyik ideális megoldás az lenne, hogy a fogadás metódusnál megtörténik az esemény kezelés és az meghívná a küldés metódust. Ezt viszont nem tudtam megírni mert ahhoz, hogy meghívjam a küldésnek át kell adnom a többek között a ’port’-ot is, de azt meg nem tudtam bevinni a ’Port_DataReceived’-hez.
A jelenlegi működés az hogy ha jön üzenet akkor egy változóba írok ’mentes_valtozo’ ezt a változót egy ciklusban (main, using) kiértékelve meghívom a küldés metódust és nullázom a ’mentes_valtozo’-t.
using (var port = new SerialPort("COM" + cp))
{
port.BaudRate = 9600;
port.Parity = Parity.None;
port.StopBits = StopBits.One;
port.DataBits = 8;
port.Handshake = Handshake.None;
port.RtsEnable = true;
port.DataReceived += Port_DataReceived;
port.Open();
while (fo_tomb_index <= (fo_tomb_merete-1))
{
if (mentes_valtozo != null)
{
WriteData(port, fo_tomb[fo_tomb_index]);
mentes_valtozo = null;
Console.WriteLine(fo_tomb[fo_tomb_index]);
fo_tomb_index++;
}
}
}
}
private static string mentes_valtozo;
private static void WriteData(SerialPort port, string readLine)
{
port.WriteLine(readLine);
}
private static void Port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
var sp = (SerialPort)sender;
string dataReceived = sp.ReadExisting();
mentes_valtozo = dataReceived;
}[ Szerkesztve ]
-
joysefke
veterán
válasz t-shirt #8654 üzenetére
Amikor a
mentes_valtozo == null
akkor a main thread üresben pörög, teljes sebességgel. És nyilván ez a "normál" állapot, mert mind a soros port, mind a munkagép sebessége elmarad a processzorétól.Másrészt a mentes_valtozo statikus. Ha két thread is hozzáfér, akkor a hozzáféréseket szinkronizálni kell.
[ Szerkesztve ]
-
-
dqdb
nagyúr
válasz t-shirt #8656 üzenetére
Ha a kommunikációban a PC a kliens és az eszköz a szerver, ami a kérésekre válaszol, akkor érdemes egy megfelelő timeout értéket választani és beállítani, amin belül a túloldalnak biztosan válaszolni kell, a DataReceived esemény kezelésére nincsen szükség, és a Read metódussal kiolvasni a választ, ez vár a timeoutnak megfelelő időt, ha nem kap választ. A válasz olvasásának módján a protokolltól függően lehet finomítani (fejléc van-e, kiderül-e előre, mekkora lesz az üzenet és hasonlók).
Ha a kommunikációban a PC a szerver és az eszköz a kliens, aminek a kéréseire válaszol a PC, akkor célszerű lenne a DataReceived eseményben egy AutoResetEvent példányt élesíteni Set metódussal, a fő ciklusban pedig WaitOne hívással várakozni rá, és ott kiolvasni a kapott adatot. Így nem pörögne 100%-on egy mag feleslegesen várakozás közben.
[ Szerkesztve ]
tAm6DAHNIbRMzSEARWxtZW50ZW0gdmFka5RydIJ6bmkuDQoNClOBc4Ek
-
joysefke
veterán
válasz t-shirt #8654 üzenetére
Én úgy értettem a dolgot, hogy a gép kezdi az üzenetváltást, és a PC szemszögéből mindig
fogadás-írás-fogadás-írás stb a sorrend. Itt a PC a szerver és ha ezt a feladatot kiszervezed egy külön threadbe akkor nyugodtan lehet blokkolni azt a threadet a munkagépre történő várakozással. Persze ahogy fölöttem írták, nem ártana ide sem egy timeout...Ha blokkoló olvasással oldod meg a dolgot, akkor valahogy így nézhet ki a dolog.
(sosem volt serial portal dolgom és ezt amit válaszoltam sem tudom futtatni)Indítasz egy threadet amely minden munkacikus elején ellenőrzi, hogy szabad-e tovább futnia, ha nem, akkor rendezetten kilép. Olvas-ír-olvas-ír amíg el nem fogynak a fo_tomb-ből a parancsok.
A main() -thread nincsen blokkolva egészen a
serverThread.Join()
-ig Ennél a pontnál bevárja a serverThread-et. ha a main()-en belül a serverThread befejezte előtt beállítod aserverAllowedToRun=false
-ot, akkor az leállítja a soros-port threadjét.class Program
{
// dummy data
private static string[] fo_tomb = Enumerable.Range(0, 100).Select(x => "Machine command nr: " + x.ToString()).ToArray();
private static bool serverAllowedToRun = true;
public static void ComServer()
{
using (var port = new SerialPort("COM4"))
{
// ezek menjenek fgv-paraméterbe
port.BaudRate = 9600;
port.Parity = Parity.None;
port.StopBits = StopBits.One;
port.DataBits = 8;
port.Handshake = Handshake.None;
port.RtsEnable = true;
port.Open();
int n = fo_tomb.Length;
int i = 0;
while (serverAllowedToRun)
{
if (i >= n) break;
// ez a te 'mentes_valtozo' -d
// a PC olvasással kezd
// ez blokkol ameddig gép nem küld valamit amit a PC tud olvasni.
// nem pörgeti a gépet
string machineMessage = port.ReadLine();
// Ha a gép küldött üzenetet, akkor válaszolunk rá
port.WriteLine(fo_tomb[i]);
i++;
}
}
}
static void Main()
{
Thread serverThread = new Thread(ComServer);
// Érdemes lehet timeoutot megadni
// pld 10 perc: TimeSpan.FromMinutes(10);
serverThread.Join();
}
}[ Szerkesztve ]
-
joysefke
veterán
válasz t-shirt #8656 üzenetére
Igen, az idő nagyobbik részében üresen pörög, okozhat ez gondot?
Az oprendszer nem tudja eldönteni, hogy egy programszál azért pörög maxon mert nem csinál semmit azon kívül, hogy egy üres ciklusban van, vagy azért mert tényleges dolga van. Pár ilyennel le lehet terhelni a gépet.Konzolos program esetében megoldható hogy várakozzon az eseményre anélkül hogy lefutna (kilépne)? Lásd pld. fent. ott a main thread bevárja a másikat mielőtt kilépne. Ha a main thread előbb végezne, akkor annak a kilépése a többi threadet is befejezné (konzol applikációban).
[ Szerkesztve ]
-
t-shirt
veterán
Köszönöm a válaszokat!
Lehet nem volt egyértelmű, így leírom pontosabban a működést.
A munkagép egy fűrészgép léptető motorral mikrovezérlővel stb, ez kapcsolódik a PC-hez.
A program elindítása után feldolgozza az adatokat egy file-ból és elkészít egy tömböt mely a vágandó deszkák méretét tartalmazza vágási sorrendben. Nem szükséges fejléc vagy egyéb azonosítás.Elsőnek a fűrészgép üzen hogy kéri az adatot -> a PC elküldi az első deszka hosszát, ez ismétlődik a tömb végéig. Az üzenet általában 4 karakter. A deszka hosszon kívül küldi még ha új darabot kell betenni vagy ha minden ki lett vágva, ezek is a tömbbe vannak berendezve a megfelelő helyre, de ezek most nem relevánsak illetve megoldottak.
Megnéztem és az üres pörgés valóban felviszi a proci terhelését, szóval ezt tényleg át kell alakítanom.
A timeout-on már én is gondolkoztam, hogy azt valahogy le kell kezelni ha egy idő után nem válaszol a munkagép. Egyenlőre nem rendelkezem azzal információval hogy mennyi ideg tart egy vágás.
Amiket írtatok igyekszem értelmezni, azt hiszem lesz még kérdésem
-
dqdb
nagyúr
válasz t-shirt #8662 üzenetére
Ez esetben elég ennyi módosítás, és nem fogja a CPU-t tekerni feleslegesen:
using (var port = new SerialPort("COM" + cp))
{
port.BaudRate = 9600;
port.Parity = Parity.None;
port.StopBits = StopBits.One;
port.DataBits = 8;
port.Handshake = Handshake.None;
port.RtsEnable = true;
port.DataReceived += Port_DataReceived;
port.Open();
while (fo_tomb_index <= (fo_tomb_merete-1))
{
receivedNewRequest.WaitOne();
var s = port.ReadExisting();
WriteData(port, fo_tomb[fo_tomb_index]);
Console.WriteLine(fo_tomb[fo_tomb_index]);
fo_tomb_index++;
}
}
}
private static WaitHandle receivedNewRequest = new AutoResetEvent(false);
private static void WriteData(SerialPort port, string readLine)
{
port.WriteLine(readLine);
}
private static void Port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
receivedNewRequest.Set();
}joysefke: a kódodnál nem azért nem fogja feleslegesen terhelni a CPU-t, mert áttetted a futását egy másik szálra, hanem azért nem, mert a példádban a SerialPort.ReadLine hívást használod, ami ReadTimeout időt vár, mielőtt visszatérne, ha nincsen adat, és közben értelmes módon várakozik.
tAm6DAHNIbRMzSEARWxtZW50ZW0gdmFka5RydIJ6bmkuDQoNClOBc4Ek
-
joysefke
veterán
Ahogy fent írtam, nem ismerem a SerialPortot, de ez a SerialPort.ReadLine() -a nevéből ítélve - blokkol nem? Innentől kezdve a thread amihez hozzá van kötve IO-limitált.
kódodnál nem azért nem fogja feleslegesen terhelni a CPU-t, mert áttetted a futását egy másik szálra
igen ezzel tisztában vagyok[ Szerkesztve ]
-
zsolti_20
senior tag
Üdv emberek! Írtam egy alkalmazást Visual Studioban C# nyelven. Lehetséges a megírt programot eladni? Vagy van valami jogi következménye ennek? Esetleg a teljes program megvásárlása esetén tudnám csak értékesíteni ezt?
-
sztanozs
veterán
válasz zsolti_20 #8668 üzenetére
Írtam egy alkalmazást Visual Studioban C# nyelven. Lehetséges a megírt programot eladni? Igen
Vagy van valami jogi következménye ennek? Igen, főleg, ha nem adsz számlát és/vagy nem adózol rendesen utána.
Esetleg a teljes program megvásárlása esetén tudnám csak értékesíteni ezt? Nem, a Community Edition használatával jogot is kapsz a haszonszerzéshez - amennyiben magánszemélyként vagy egyéni vállalkozóként fejlesztesz és nem egy nagy cég szerződéses fejleszőjeként dolgozol .[ Szerkesztve ]
JOGI NYILATKOZAT: A bejegyzéseim és hozzászólásaim a személyes véleményemet tükrözik; ezek nem tekinthetők a munkáltatóm hivatalos állásfoglalásának...
-
t-shirt
veterán
Szia!
Egy olyan kérdésem lenne, hogy a program által kiküldött string végére mindig tesz egy "\r\n" -t (új sor, előre ugrás). Valahogy megoldható, hogy ezeket ne küldje csak a string-et?
A program igazából jól működik csak valami gondja van a vezérlőnek és próbáljuk kizárni a lehetséges hibákat hátha ez segítene.
-
joysefke
veterán
Sziasztok!
Van egy .NET Core 2.1 + ASP.NET CORE 2.1 Web app-om.
Nem túl nagy, én csináltam, és hozzá tudok/merek nyúlni. A célom az lenne, hogy1, egyrészt a legutolsó stable .NET Core + ASP.NET Core verzión tartsam, lehetőség szerint
2, lehetőség szerint mindig közvetlenül (ha lehet self contained opció nélkül) tudjam Azure App Service-ben futtatni.
Egy hónap után újra deployoltam az appot Azure-ra. Különböző okok miatt ezzel megint órákat sz**tam mire végül elindult Azuron. Az Azure hibaüzenetek számomra elég semmitmondóak. stb stb. A vége az lett, hogy most csak a self contained opcióval tudtam futásra bírni. Egy hónapja órák hosszat szívtam az Azure-val (ekkor láttam az Azure-t először) mire rájöttem, hogy ha a release targetet x86-ra állítom, akkor hajlandó lesz elindulni az app, itt még nem kellett neki a self contained opció
Azt lehet előre tudni, hogy a 2.1 -> 3.0 (stable) az egy közvetlen lépés lesz-e, vagy útba kell-e ejteni a .NET Core 2.2, ASP NET Core 2.2-t? Vagy bele kell nyúlni a kódba stb?
Elolvastam a 2.1->2.2 update instrukciókat és van benne rendesen manuális konfig fájl írás. Attól félek, hogy ha nekiállok a csomag verziókat kézzel editálgatni, akkor egy következő váltásnál megint szenvedéssel fogom Azuron működésre bírni.
Nyilván csinálhatok egy üres 2.2-es projektet és manuálisan átmásolhatok bele mindent, de az megint plusz munka.
.csproj
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp2.1</TargetFramework>
<UserSecretsId>9b4b6fbc-c156-49cb-9d78-15de78924438</UserSecretsId>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<PlatformTarget>AnyCPU</PlatformTarget>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
<PlatformTarget>x86</PlatformTarget>
</PropertyGroup>
<ItemGroup>
<Folder Include="Migrations\" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="CsvHelper" Version="9.2.3" />
<PackageReference Include="FluentValidation" Version="8.1.1" />
<PackageReference Include="MailKit" Version="2.1.2" />
<PackageReference Include="Microsoft.AspNetCore.App" />
<PackageReference Include="Microsoft.AspNetCore.Razor.Design" Version="2.1.2" PrivateAssets="All" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="2.1.4" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.1.8">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="2.1.1" />
</ItemGroup>
<ProjectExtensions><VisualStudio><UserProperties /></VisualStudio></ProjectExtensions>
</Project>Szerk:
Az sem tiszta, hogy a VS Installer miért nem ajánlja fel a 2.2-es SDK telepítését, miért kell azt VS-en kívülről telepíteni[ Szerkesztve ]
-
martonx
veterán
válasz joysefke #8673 üzenetére
Önmagában az update az nudli. viszont ha már Azure-ozol, azzal illik tisztában lenni, hogy a futtató környezetek mindig kis lemaradásban vannak, azaz ez nem úgy megy, hogy kijön egyik nap az Asp.Net 2.2 és akkor másnap már az Azure is tudja, és Azure szerte mindenhova fel van telepítve. Ennek 1-2 hét, de akár hónap is kellhet (AWS és egyéb felhő szolgáltatóknál még rosszabb a helyzet).
Én kérek elnézést!
-
joysefke
veterán
válasz martonx #8675 üzenetére
azzal illik tisztában lenni, hogy a futtató környezetek mindig kis lemaradásban vannak
Persze, a dolognak ez a része egyértelmű, és az ember nem is ugrik rá addig a legújabbra, amíg azzal nincsen tapasztalat. Jobb más kárán tanulni.
Ami nekem nem tiszta az, hogy ha az Azuron elérhető lesz egy újabb verziójú futtatókörnyezet, de az én projektem verzió lemaradásba került, akkor meddig tudom azt deployolni Azurra, illetve ha már van az Azuron egy nem utolsó stabil verziós futtatókörnyezetre támaszkodó appom, annak a függősége meddig lesz támogatva? Mikor húzzák ki a futó app alól a szőnyeget?
Különösen, ha "free tier" App Servicen vagyok, ahol nyilván shared VM-ek futtatják az appokat és gondolom nem fognak az én hobbi projektem miatt határozatlan ideig fenntartani egy kifutó futtatókörnyezetet.
Szóval, ha előbb utóbb szeretném békénhagyni a projektet és hagyni, hogy csak fusson magában, akkor nem jobb-e mégis csak "self hosted"-ként deployolni, még akkor is, ha egyébként tudnám közvetlenül futtatni?
üdv
J.[ Szerkesztve ]
-
martonx
veterán
válasz joysefke #8677 üzenetére
"Ami nekem nem tiszta az, hogy ha az Azuron elérhető lesz egy újabb verziójú futtatókörnyezet, de az én projektem verzió lemaradásba került, akkor meddig tudom azt deployolni Azurra"
Évekig. A .Net Core 1.1-et mondjuk hamarosan kivezetik, de ha jól rémlik 2 éve jött ki az 1.1.
Ilyen étren semmi különbség nincs a free tier és a shared között. Sőt még ha erősen fizetsz érte se fognak a bevett gyakorlatukon csak miattad változtatni.Hm, bár pont tudok ellenpéldát is mondani, nekünk az Amazaon AWS volt, hogy adott plusz egy év türelmi időt, igaz mi havi 20-30.000 dollárt hagyunk náluk, nem havi 10-et
[ Szerkesztve ]
Én kérek elnézést!
-
joysefke
veterán
.NET Core 2.1, ASP.NET Core 2.1 IPasswordValidator
Amikor kreálok egy usert, akkor a beállított password policy szépen alapján a kért jelszó erőssége szépen validálásra kerül,
azonban amikor meg akarom változtatni a beállított jelszót és a kért új jelszó erősségének validálásához a beépített default
IPasswordValidator
ból (amit bár nem konfiguráltam DI-re, mégis valahogy működik a[FromServices]
) kérek egy példányt és azzal próbálok validálni, akkor a validálás nem működik, bármilyen jelszó elfogadásra kerül.Startup.cs
services.AddIdentity<AppUser, IdentityRole>(
opts => {
opts.User.RequireUniqueEmail = true;
opts.Password.RequiredLength = 3;
opts.Password.RequireNonAlphanumeric = false;
opts.Password.RequireLowercase = false;
opts.Password.RequireUppercase = false;
opts.Password.RequireDigit = false;
})Kontroller
Usert így kreálom:AppUser newUser = new AppUser { UserName = model.Name, Email = model.Email };
IdentityResult result = await userManager.CreateAsync(newUser, model.Password);
if (result.Succeeded)
{
// safe to assume that the below operation will succeede
await userManager.AddToRoleAsync(newUser, "Admins");
return RedirectToAction(nameof(AdminUsers));
}És így szeretném megváltoztatni a passwordot:
Fügvény deklaráció, DI. Érdekes, hogy a Startup-ban én semmit nem rendeltem az IPasswordValidator-hoz
public async Task<IActionResult> Edit2(
[FromServices]IPasswordValidator<AppUser> passwordValidator,
[FromServices]IPasswordHasher<AppUser> passwordHasher,
EditModel model, string newPwd).....
Itt szeretném a jelszó erősségét validálni és ha megfelel megjelölöm, hogy updatelni akarom
IdentityResult passwordResult = await passwordValidator.ValidateAsync(userManager, userToEdit, model.Password);
if (!passwordResult.Succeeded)
foreach (var error in passwordResult.Errors)
ModelState.AddModelError("", error.Description);
else
passwordNeedsChange = true;Itt hajtom végre az IdentityUser updétjét:
if (ModelState.IsValid)
{
if (emailNeedsChange)
userToEdit.Email = model.Email;
if (passwordNeedsChange)
userToEdit.PasswordHash = passwordHasher.HashPassword(userToEdit, model.NewPassword);
var updateResult = await userManager.UpdateAsync(userToEdit);
....
}Előre is köszi!
#8679 Köszi!
[ Szerkesztve ]
-
joysefke
veterán
válasz petyus_ #8681 üzenetére
Nincs most vS a közelben, van bennem egy sör
1, egyetlen tranzakciót szeretnék, ha sikerül, akkor minden sikerüljön, ha nem sikerül, akkor semmi változás ne legyen. Attól függetlenül, hogy minden előre falidálva van
2, amit találtam fgv az valami email tokent kért paraméterként.
-
petyus_
senior tag
válasz joysefke #8682 üzenetére
1. most hirtelen nem tudom a választ, valószínűleg a DI-al lesz a gond, nem azt a passwordValidatort kapod, amit a userManager használ.
2. az a reset password, ott nincs belépve a user, hanem pl elfejtette a jelszavát, kiküldöd neki a passwordResetToken-t, rányom a linkre, és úgy kapod meg.
De a ChangePassword, amit írtam korábban, az belépett felhasználóra vonatkozik, oda csak egy oldPassword, newPassword kell.
-
joysefke
veterán
válasz martonx #8684 üzenetére
Mi a gyári default megoldás, mert én azt hittem, hogy az a default amit én csináltam...?
Egyébként nem a fórumra írogatással szoktam kezdeni8683:
Én is erre gondoltam. Startup-ban nincsen konfigurálva DI az IPasswordValidator-hoz, mégis visszaad egy valamilyen default validátor objektumot. Valószínűnek tartom, hogy ez a default validátor nem tartalmazza automatikusan a Startup.AddIdentity()-ben bekonfigurált pwd-requirementeket. Arra, hogy hogyan kéne csinálni viszont nem találtam példát (csak custom pwd-validátorra, azt viszont nem feltétlenül akarok)[ Szerkesztve ]
-
martonx
veterán
válasz joysefke #8685 üzenetére
Így fejből nem tudom. Csinálnék egy új projektet bekapcsolt security-vel, és árgus szemekkel figyelném a kapott kész kódot (ez alapból valami nuget package mögé lesz rejtve, és ki kell scaffoldolni, hogy tényleg látszódjon). Ami kész van és működik, arra minek custom megoldás?
Én kérek elnézést!
-
joysefke
veterán
válasz martonx #8687 üzenetére
A Petyus_ féle Usermanager.ChangePasswordAsync(...) tökéletesen működik, azt csinálja ami nekem kell. Nem értem, hogy kerülhette el a figyelmemet pont ez a metódus, amikor vS-ban böngésztem a UserManager interfészét...
8683 Petyus_
De a ChangePassword, amit írtam korábban, az belépett felhasználóra vonatkozik, oda csak egy oldPassword, newPassword kellKipróbáltam, nem szükséges feltétel, hogy belépve legyen a felhasználó akinek megváltoztatod a jelszavát.
[ Szerkesztve ]
-
mdk01
addikt
Sziasztok, hogyan lehet egy tömb elemei közül véletlenszerűen kiválasztni egyet? A neten csak olyan példákat találok ahol a tömböket véletleszerű számokkal töltii fel de ez nem ugyanaz.
Int veletlen=rnd.Next(tm[i ]);
megoldásnál aláhúzza pirossal az i-t.
Köszönöm[ Szerkesztve ]
-
Keem1
veterán
Bocsánat, nem tudtam, hogy kezdő vagy.
Szóval, a random szám generátorral csak egy random tömbindexet készítesz, nem a tömb egy random indexét veszed ki.Tehát a séma:
- X legyen egy véletlen szám, ami legalább 0, legfeljebb a tömböd mérete.
- a keresett elem az X indexű elem a tömbbentomb[X]
.[ Szerkesztve ]
-
t-shirt
veterán
Tiszteletem!
Lenne egy valószínűleg amatőr kérdésem.
Ha generálok egy listát ami változó tartalmú/elemszámú lehet és a listából RadioBotton-okat hozok létre akkor hogyan tudom egy eseménykezeléssel lekérdezni hogy melyik lett kiválasztva?
foreach (string elem in lista)
{
RadioButton rdo = new RadioButton();
rdo.Text = elem;
rdo.Location = new Point(5, rdo_y);
bool CheckedChanged = false;
this.Controls.Add(rdo);
rdo_y += 20;
} -
t-shirt
veterán
Köszönöm. Azt tudom hogy ezek kellenek, illetve ezeket találtam általában a leírásokban is, de sehogy nem akar összejönni. Lepróbálgattam az "iskola példákat" azok persze mennek, de azokban konkrét kirakott radiobutton-ok vannak amikre lehet CheckedChanged -et dobni, a sender-t meg nem is igazán értem igazán, azt is csak egy konkrét rb-vel tudtam meghívni és amit kiírt azzal se mentem sokra.
Nyilván én csinálok valamit rosszul, de tényleg nem jövök rá hogy mit.
[ Szerkesztve ]
-
Zalanius
tag
válasz t-shirt #8699 üzenetére
A ciklusban, a létrehozott példányoknál célszerű elvégezni még az eseménykezelő hozzárendelését, valahogy így:
rdo.CheckedChanged += new System.EventHandler(this.Altalad_Felirt_Metodus);
Aztán az eseménykezelőben a sender objectről feltételezzük, hogy RadioButton:
RadioButton rb = (RadioButton)sender;
// stb.De lehet külön típusvizsgálatot is tartani egy is segítségével, ha éppen szükséges.
--= Zalán =--
Új hozzászólás Aktív témák
Hirdetés
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- Befagy az egész gép
- Call of Duty: Black Ops 6
- Milyen notebookot vegyek?
- Sorozatok
- Autós topik látogatók beszélgetős, offolós topikja
- Black Friday november 29. / Cyber Monday december 2.
- Filmvilág
- Milyen asztali (teljes vagy fél-) gépet vegyek?
- HDD probléma (nem adatmentés)
- Folyószámla, bankszámla, bankváltás, külföldi kártyahasználat
- További aktív témák...
- XFX Radeon Speedster SWFT 319 RX 6800 - BONTATLAN - ALZA GARANCIA
- Bomba ár! Lenovo X1 Yoga 3rd - i5-8GEN I 8GB I 256GB SSD I 14" 2K Touch I W11 I CAM I Garancia!
- Bomba ár! Lenovo X1 Carbon G3: i7-G5 I 8GB I 256GB SSD I 14" QHD I HDMI I Cam I W10 I Gari!
- Bomba ár! Lenovo ThinkPad T450s - i5-5GEN I 8GB I 128GB SSD I 14" HD+ I Cam I W10 I Garancia!
- Bomba ár! Lenovo ThinkPad T14s - i5-10G I 8GB I 256GB SSD I 14" FHD Touch I Cam I W11 I Garancia!
Állásajánlatok
Cég: HC Pointer Kft.
Város: Pécs
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest