- bb0t: Gyilkos szénhidrátok, avagy hogyan fogytam önsanyargatás nélkül 16 kg-ot
- Lalikiraly: MSI Cyborg 15 - Tényleg Kiborg.
- Sub-ZeRo: Euro Truck Simulator 2 & American Truck Simulator 1 (esetleg 2 majd, ha lesz) :)
- Luck Dragon: Asszociációs játék. :)
- antikomcsi: Való Világ: A piszkos 12 - VV12 - Való Világ 12
Új hozzászólás Aktív témák
-
x007
tag
Majdnem
static void Main(string[] args)
{
int n = int.Parse(Console.ReadLine());
Console.WriteLine("Osszeg: {0}, Atlag: {1}", n*(n+1) / 2, (double)(n+1) / 2.0);
}De lehet pl így is:
static void Main(string[] args)
{
int n = int.Parse(Console.ReadLine());
Console.WriteLine("Osszeg: {0}, Atlag: {1}",
Enumerable.Range(1, n).Sum(),
Enumerable.Range(1, n).Select(v => (double)v).Average());
} -
x007
tag
Talán a legegyszerűbb, hogyha XML fájlban tárolnád a Credentials adatokat, olvasáshoz/íráshoz a LinQ to XML-t ajánlom. Innen indulva mindent megtudhatsz:
http://msdn.microsoft.com/en-us/library/system.xml.linq.xdocument.aspx
Jelszavakat hashelve tároljad. Ahhoz, hogy ne tudjon beletúrni mindenki, szerintem fájl hozzáférési jogokkal szabályozz.
-
x007
tag
válasz acélkemény #1117 üzenetére
Első, egyszerű ötlet:
GroupBox helyett UserControl-t használj. Igaz, így több fájl fogja leírni az ablakod, de legalább normálisan tudod szerkeszteni.[ Szerkesztve ]
-
x007
tag
válasz acélkemény #1119 üzenetére
-
x007
tag
válasz acélkemény #1121 üzenetére
Nem tudom mire gondolsz .
A színes sávot dokkoltam a tetejére, így követi a UserControl méretét.
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.dock.aspxA GroupBox-nak pedig az Anchor tulajdonságát állítottam, hogy kövesse a UserControl méretét.
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.anchor.aspx -
x007
tag
válasz acélkemény #1123 üzenetére
Amikor elhelyezed a UserControl példányt a formon, akkor tudod azt méretezni is. Az más kérdés, hogy a UserControl-ra helyezett vezérlőket lehet úgy konfigurálni, hogy érzékenyek legyenek a UserControl méretváltozására.
Az tabokat reprezentáló UserControl-okat én egymásra raktam úgy, hogy a Left, Top, Width, Height értékek megegyezzenek. Azt, hogy éppen melyik jelenjen meg, a Visible fogja meghatározni.
-
x007
tag
válasz acélkemény #1127 üzenetére
http://msdn.microsoft.com/en-us/library/system.windows.forms.listbox.selectedindexchanged.aspx
http://msdn.microsoft.com/en-us/library/system.windows.forms.listcontrol.selectedvaluechanged.aspx
Én azt gondoltam volna, hogy az alábbi esetben, ha cserélgeted a kiválaszott elemet, akkor a ValueChanged nem váltódik ki, mert a SelectedValue referencia nem változik. De kipróbáltam, tévedtem.
class ListItem
{
public string Value { get; set; }
public override string ToString()
{
return this.Value;
}
}
public Form1()
{
InitializeComponent();
ListItem item = new ListItem() { Value = "Hello World!" };
listBox1.Items.Add(item);
listBox1.Items.Add(item);
listBox1.Items.Add(item);
listBox1.Items.Add(item);
}Szerintem nincs köztük semmi különbség.
-
x007
tag
válasz Briganti #1126 üzenetére
Én nem raknám Formba a DataSet-et. Sztem úgy jársz a legjobban, hogyha generálsz az adatbázisból egy strongly typed datasetet és annak kód részébe csinálsz egy statikus tulajdonságot, amivel globálisan el lehet annak egy példányát érni. Így:
public partial class MyDataSet
{
private static MyDataSet _instance;
public static Cache Instance
{
get
{
if (_instance == null)
{
_instance = new MyDataSet();
}
return _instance;
}
}
}Így a programodban bárhon tudsz majd az adatokra hivatkozni, értelemszerűen így:
MyDataSet.Instance
-
x007
tag
válasz Briganti #1134 üzenetére
http://www.speedyshare.com/files/20176158/DatasetTutorial.avi
Sztem érdemes csinálni egy Loading... ablakot (ami a program indulásakot jelenik meg) és abban feltölteni adapterekkel a táblákat. Használd a BackgroundWorker vezérlőt .
-
x007
tag
Én elég hamar működésre bírtam...
-
x007
tag
Sokkal karbantarthatóbb így a kód. Sok textbox-ra már általános megoldást csinálnék (most nem raktam bele többet):
-
x007
tag
válasz Briganti #1194 üzenetére
Itt az adapter használata egyébként teljesen fölösleges.
openConnection();
dbCommand = new OleDbCommand(qText, dbConnection);
dbCommand .ExecuteNonQuery();
closeConnection();Másrészt: Csináltam neked egy kis DataSet tutorial videót anno. Miért nem úgy használod? Nem is kéne SQL parancsokat írnod, mert képes arra, hogy a DataSeten végrehajtott módosításokat (hozzáadás, törlés, érték módosítás) automatikusan végrehajtsa az adatbázisban. Nem teljesítménykritikus alkalmazásnál szerintem mindenképpen érdemes lenne használni.
[ Szerkesztve ]
-
x007
tag
válasz FehérHolló #1203 üzenetére
Pongyolán megfogalmazva: Az XML egy hierarchikus adatbázis, az SQL pedig relációs adatbázisokhoz van. Innentől nincsen értelme a kérdésnek . XPath segítségével lehet lekérdezéseket definiálni XML-hez.
http://en.wikipedia.org/wiki/XPath_1.0
A másik problémádra szerintem biztos, hogy nincsen beépített .NET osztály. Egy ilyet találtam viszont:
Nem próbáltam ki, de van egy olyan érzésem, hogy több bajod lesz vele, mintha magadtól írnád át a lekérdezéseket .
-
x007
tag
A problémádat megoldja, hogyha a DisableControls() után meghívod a Application.DoEvents() metódust. Az ilyen megoldásokat azonban, ha lehet, kerüljük. Általánosságban elmondható, hogy időigényes feladatokat nem hajtunk végre a GUI szálon (ilyen egy vezérlő eseménye is, pl: Click), hanem egy új szálat hozunk létre, hogy a végrehajtás a háttérben történjen. Ezt könnyen megteheted a BackgroundWorker komponens segítségével, elég sok problémát levesz a programozó válláról.
Valami ilyet kéne csinálnod:
private void button1_Click(object sender, EventArgs e)
{
DbDetails arg =
new DbDetails
{
Server = ...,
Database = ...,
User = ...,
Password = ...,
};
connectStatusBar.Items[0] = "Testing connection...";
DisableControls();
backgroundWorker1.RunWorkerAsync(arg);
}
private class DbDetails
{
public string Server { set; get; }
public string Database { set; get; }
public string User { set; get; }
public string Password { set; get; }
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
DbDetails arg = e.Argument as DbDetails;
e.Result = TestConnection(arg.Server, arg.Database, arg.User, arg.Password);
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null && (bool)e.Result)
{
//Sikerult csatlakozni
//TODO: Impl
}
else
{
//Nem sikerult csatlakozni
//TODO: Impl
}
}A DoWork eseménykezelőbe kell helyezned a kódot, amit a háttérben szeretnél végrehajtani. Fontos, hogy ebben nem hivatkozhatsz a Form-on található vezérlőkre szinkronizációs problémák miatt. Ezért van szükség jelen példában a DbDetails segédosztályra.
A RunWorkerCompleted eseménykezelő a feladat végrehajtása után mindig végrehajtódik. Ha valamilyen kivétel keletkezett, akkor azt a e.Error tulajdonságból kiolvashatod. Az e.Result tulajdonságból a DoWork eseménykezelőben beállított visszatérési érték olvasható ki.
[ Szerkesztve ]
-
x007
tag
Jaaaa, WPF-ben nincsen gyári DoEvents, viszont van workaround:
private void button1_Click(object sender, RoutedEventArgs e)
{
button1.IsEnabled = false;
WpfApplication.DoEvents();
Thread.Sleep(3000);
button1.IsEnabled = true;
}
/// <summary>
/// Designates a Windows Presentation Foundation application model with added functionalities.
/// </summary>
public class WpfApplication : Application
{
private static DispatcherOperationCallback exitFrameCallback = new
DispatcherOperationCallback(ExitFrame);
/// <summary>
/// Processes all UI messages currently in the message queue.
/// </summary>
public static void DoEvents()
{
// Create new nested message pump.
DispatcherFrame nestedFrame = new DispatcherFrame();
// Dispatch a callback to the current message queue, when getting called,
// this callback will end the nested message loop.
// note that the priority of this callback should be lower than the that of UI event messages.
DispatcherOperation exitOperation = Dispatcher.CurrentDispatcher.BeginInvoke(
DispatcherPriority.Background, exitFrameCallback, nestedFrame);
// pump the nested message loop, the nested message loop will
// immediately process the messages left inside the message queue.
Dispatcher.PushFrame(nestedFrame);
// If the "exitFrame" callback doesn't get finished, Abort it.
if (exitOperation.Status != DispatcherOperationStatus.Completed)
{
exitOperation.Abort();
}
}
private static Object ExitFrame(Object state)
{
DispatcherFrame frame = state as DispatcherFrame;
// Exit the nested message loop.
frame.Continue = false;
return null;
}
}Megjegyzem, hogy ez továbbra se fogja teljes mértékig megoldani a problémát, mert az ablak ugyanúgy meg fog fagyni a DB kapcsolat tesztelésekor. (WinForms esetén is így lenne) Szóval mindenképpen javaslom a BackGroundWorker használatát.
-
x007
tag
Olvass dokumentációt...
http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx -
x007
tag
-
x007
tag
Linq to SQL
Entity FrameworkEzek nem alternatívái a DataSet-nek, mert kapcsolatalapú adatelérést biztosítanak ellentétben a DataSet-tel, ami kapcsolat nélküli adatelérést biztosít. Keress rá, hogy ezek mit jelentenek, nem akarok regélni .
Mérlegelni kell, hogy az alkalmazásodnak melyik jó. Én úgy gondolom, hogy egy szótár szoftvernek fölösleges betöltenie az összes szót a memóriába, így érdemes használni a fent említett két technológia közül az egyiket. Linq to SQL-t szoktam használni, de a jövő egyértelműen az Entity Framework (mondjuk jelen állapotáról nem sok jót hallottam eddig ).
-
x007
tag
Tanulmányozd a Binding objektumot... Nagyon sokmindent meg lehet vele csinálni.
http://www.c-sharpcorner.com/UploadFile/mahesh/WPFDataBinding08012008233147PM/WPFDataBinding.aspx -
x007
tag
válasz Gregorius #1242 üzenetére
DataSet használatakor az adatbázist cacheljük a memóriába, a lekérdezések a memóriában hajtódnak végre. EF és L2S használata esetén a lekérdezések mindig az adatbázis szerveren hajtódnak végre, ezért én nem sorolnám ezeket a kapcsolat nélküli adateléréshez. (sztem valahol a kettő között van ) Az adatmanipuláció mechanizmusa viszont valóban hasonló.
-
x007
tag
-
x007
tag
Igen, ez VB6-nak tűnik.
Kérdésekre válasz:
MessageBox-ra példa:
result =
MessageBox.Show(
this,
message,
caption,
MessageBoxButtons.YesNo,
MessageBoxIcon.Question,
MessageBoxDefaultButton.Button1);http://msdn.microsoft.com/en-us/library/ctd56yay.aspx
Dátum formázásra példa:
DateTime date = DateTime.Now;
date.ToString("yyyy.MM.dd hh:ss");[ Szerkesztve ]
-
x007
tag
Nehezen tudtam elképzelni, de feltelepítettem az IDE-t, ott van az:
[link]Innentől annyi a dolgod, hogy csinálj egy különálló alkalmazás szerver szoftvert, ami az adatbázis műveleteket végzi. A különböző funkciókat publikáld szolgáltatásként. Importáld a szolgáltatást az SL alkalmazásba, a generált proxy osztállyal el fogod tudni érni a funkciókat.
-
x007
tag
válasz FehérHolló #1395 üzenetére
WinForms elemekhez csak a GUI szálból férhetsz hozzá, különben kivétel dobódik (ki lehet kapcsolni, de ne tegyük, nem kibaszásból csinálták . Ezzel kizárva az Items propertyn keresztül való hozzáadás.
Ha BindingSource-t használsz, akkor is kivétel dobodik, hiszen a BindingSource is egy WinForms control.
personBindingSource.Add(new Person() { FirstName = "Jakab", LastName = "Gipsz" });
ThreadPool.QueueUserWorkItem((s) =>
{
personBindingSource.Add(new Person() { FirstName = "John", LastName = "Smith" });
});BindingList-tel viszont lehet másik szálból hozzáadni elemet. Engem ez személy szerint meglepett, mert WPF-be ilyenkor is kivétel dobódik (szerintem ez utóbbi a helyes működés).
var collection = new BindingList<Person>();
dataGridView1.DataSource = collection;
collection.Add(new Person() { FirstName = "Jakab", LastName = "Gipsz" });
ThreadPool.QueueUserWorkItem((s) =>
{
collection.Add(new Person() { FirstName = "John", LastName = "Smith" });
});Én azt tanácsolom, hogy csak GUI szálból adj az adatforráshoz elemet. Nagy szívásokba eshetsz bele, ha nem tartod ehhez magad.
-
x007
tag
Szinkronizálni az Invoke metódussal lehet, tehát a fenti kód így módosítva működni fog.
ThreadPool.QueueUserWorkItem((s) =>
{
this.Invoke(new Action(() =>
{
personBindingSource.Add(new Person() { FirstName = "John", LastName = "Smith" });
}));
});A 'this' egy Form objektumra hivatkozik ezesetben.
Ha ehhez tartod magad, akkor nyílván thread safe lesz a grid, mivel csak a GUI szálon nyúlsz hozzá.
-
x007
tag
válasz Gregorius #1404 üzenetére
Oh, itt már volt új info Kicsit utána néztem.
SynchronizationContext.Current
WinForms esetén: WindowsFormsSynchronizationContext
A Send/Post metódus a Control.Invoke/BeginInvoke metódust hívja meg.
WPF esetén: DispatcherSynchronizationContext
A Send/Post metódus a Dispatcher.Invoke/BeginInvoke metódust hívja meg
Szóval ez egy általános wrapper a GUI rendszerek szinkronizációs megoldása fölött. És már látom is miért jó ez...
Van pl. a BackgroundWorker, ami az AsyncOperationManager osztályon alapul, ami a SynchronizationContext-et használja a szinkronizáció megvalósításához. Ezért a BackgroundWorker WinForms és WPF alatt is tud működni. Sőőőt, ha saját ablakozó rendszert írsz, akkor megoldhatod, hogy az alatt is működjön .
Tetszik...
[ Szerkesztve ]
-
x007
tag
válasz REDeath #1406 üzenetére
ASP.NET WebForms-ban szerintem c# kóddal való markup létrehozást mindenképpen kerülni kell, teljesen karbantarthatlan lesz tőle a kód, amit lehet próbáljuk meg dekleratív módon megoldani.
Lista vezérlőkből én a ListView-t tudom javasolni, mert afölött teljesen te rendelkezel, nem szemeteli tele a renderelt markupot olyan tagekkel, amit nem is akarsz, hogy ott legyen. A sablonokban használhatsz ASP.NET vezélőket, HTML tageket is, ami csak jól esik. Keress példákat, biztos tetszeni fog neked is .
ASP.NET MVC-ben (most ismerkedem vele) lehet ilyet csinálni (aspx fájlban):
<% foreach (var product in ViewData) { %>
<div>
<%=product.Category.CategoryName %>
</div>
<%} %>Ez csúnyának tűnhet elsőre, de nekem egyre jobban tetszik .
[ Szerkesztve ]
-
x007
tag
válasz REDeath #1409 üzenetére
Az nem probléma szerintem, hogy beleszúr scripteket. Amit írtam, abban arra gondoltam, hogy ha a vezérlők beszúrnak olyan elemeket is, amit nem akarsz vagy amiről nem tudsz, akkor pl css írásakor több szívás lesz.
Igazándiból azt kell mérlegelni, hogy megéri-e azt a plussz időt belefektetni, hogy saját megoldásod legyen. Codebehindba ne nagyon írj lekérdezéseket, használj ObjectDataSource-t, az teljes szabadságot ad .
-
x007
tag
A problémától függetlenül, ne használd a VS2008 designert, elég használhatatlannak tartom , mindent markup editorral csinálj meg.
-
x007
tag
válasz FehérHolló #1418 üzenetére
Nem elavult, minden GUI framework vezérlése egyszálú. Voltak próbálkozások többszálú GUI kialakítására, de nem igazán jött össze senkinek, amolyan Failed Dream maradt.
-
x007
tag
válasz FehérHolló #1422 üzenetére
Nem értem, hogy ettől miért lenne elavult. És azt se értem, hogy miért irtózol a BackgroundWorker nélküli marshallozástól, szerintem nem egy bonyolult dolog...
Probléma akkor lehet, ha nagyon gyakran akarsz a GUI-hoz hozzányúlni. Ilyenkor érdemes bufferezni a kéréseket marshal előtt, majd egyszerre átadni egy "nagyobb" adagot. Ez az ami egyedül gondot okozhat szvsz.
-
x007
tag
válasz FehérHolló #1427 üzenetére
"...,hogy miért irtózol a BackgroundWorker nélküli marshallozástól"
-
x007
tag
válasz Gregorius #1485 üzenetére
Néhány esetben azért indokolt lehet, ha nem akarod, hogy leálljon az alkalmazás. AppDomain.UnhandledException ugyan elkapja a nem kezelt kivételt, de a process elszáll.
Én például a worker szálak kódját szoktam trycatchException blockba tenni, így a catch elkapja a nem várt kivételeket, naplózhatom, és az alkalmazás sem borul.
Persze ennek használatának feltétele, hogy az alkalmazás semmikép se kerüljön inkonzisztens állapotba. Tudom... nem szép... ütemező alkalmazásnál még "végtelen ciklust" is okozhat, szóval azért óvatosan kell vele bánni.Naplózó rutinnál (pl TraceListener) is érdemes lehet a biztonság kedvéért elkapni mindent. Mondjuk ez se túl szép...
-
x007
tag
válasz ArchElf #1487 üzenetére
Ott nem kell elkapnod az exceptiont, elég ha tryfinally-t használsz. Egyébként szerintem ilyen esetekben érdemes csinálni egy Scope : IDisposable osztályt (lsd TransactionScope), ami transzparensen kezeli a külső "erőforrást". Impersonation esetén nekem így nézett ki:
using(new ImpersonationScope(domain, user, password))
{
}[ Szerkesztve ]
Új hozzászólás Aktív témák
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- Nők, nőügyek (18+)
- bb0t: Gyilkos szénhidrátok, avagy hogyan fogytam önsanyargatás nélkül 16 kg-ot
- Sweet.tv - internetes TV
- Kerékpárosok, bringások ide!
- iOS alkalmazások
- CASIO órák kedvelők topicja!
- Ukrajnai háború
- Lalikiraly: MSI Cyborg 15 - Tényleg Kiborg.
- Formula-1
- Diablo IV
- További aktív témák...
- T Phone Pro 5G 128GB, Kártyafüggetlen, 1 Év Garanciával
- CAT B30, Kártyafüggetlen, 1 Év Garanciával
- BESZÁMÍTÁS! HP Elitedesk 800 G3 SFF asztali számítógép - i7 7700 16GB RAM 500GB SSD Intel HD Graphic
- BESZÁMÍTÁS! Optiplex 7080 Micro asztali számítógép - i5 10500T 16GB RAM 256GB SSD 630 IGP Win 11
- BESZÁMÍTÁS! SAMSUNG Odyssey G7 C32G75T monitor garanciával hibátlan működéssel
Állásajánlatok
Cég: Ozeki Kft.
Város: Debrecen
Cég: Alpha Laptopszerviz Kft.
Város: Pécs