|
So I'm learning C# WPF coming from Java. Those who know Java, know it can get interesting creating complicated widows applications as it's all done in Java code (I've never seen it done like wpf work xaml).
I'm not sure if this is something I want to take yet, but it is a question in the back of my mind.
Our company IT guy says you can make a custom dll of ui elements in xaml and code, then compile as a dll. I asked because I want sure if you could only write dlls with C# code and not xaml, he did admit in the several years in C C# he's never actually done this.
But, is it possible to write the dll, using common already available controls and maybe extending the classes idk yet. But using common wpf controls changing the view of those controls.
For example, say I wanted to change the look of the openfiledialog but keep all the functionality (maybe add to it) is there a way to capture the functionality, and build a GUI for it?
|
|
|
|
|
The "OpenFileDialog" is part of the "Windows common controls", and is NOT a "WPF control" you can style (using WPF "styles").
A dll can contain all kinds of "classes"; it's simply a matter of including the right "references" to .NET "system" libraries when building it.
A dll can contain both WPF "Windows" and Windows "Forms"; user controls; and custom classes and controls.
XAML is simply "presentation" (like HTML) that gets compiled and incorporated at run time. Whatever you do in XAML, can pretty well be constructed on the fly in code. XAML does not require any special treatment (exe vs dll).
"(I) am amazed to see myself here rather than there ... now rather than then".
― Blaise Pascal
|
|
|
|
|
Gerry Schmitz wrote: A dll can contain both WPF "Windows" and Windows "Forms"; user controls; and custom classes and controls. Have you ever done this yourself ? Seen it done ? Evidence ?
«... thank the gods that they have made you superior to those events which they have not placed within your own control, rendered you accountable for that only which is within you own control For what, then, have they made you responsible? For that which is alone in your own power—a right use of things as they appear.» Discourses of Epictetus Book I:12
|
|
|
|
|
Yes; I CREATE AND USE Dll's in my apps "containing WPF AND Windows Forms; etc.".
e.g. customer required custom "settings" functions. New functions (including WPF for data entry; Windows forms for the "windows charting control" and "report (rdlc) viewing)" were added as a SEPARATE DLL.
A "class library", by default, does not have references to WPF, XAML or Windows Forms "system" dll's; you add them explicitly. Then you add the Windows, etc.
The fact that this is beyond your comprehension, does not negate the fact that it can and is being done.
Better stick to bit-fiddling.
(I also use DLL's for my Entity Framework "repositories" / DAL / whatever; or an XML pickup).
"(I) am amazed to see myself here rather than there ... now rather than then".
― Blaise Pascal
|
|
|
|
|
Upvoted. I am delighted to read a post from you with on-topic content
Seriously, I think it would be very valuable for CodeProject to have an article on this.
thanks, Bill
«... thank the gods that they have made you superior to those events which they have not placed within your own control, rendered you accountable for that only which is within you own control For what, then, have they made you responsible? For that which is alone in your own power—a right use of things as they appear.» Discourses of Epictetus Book I:12
|
|
|
|
|
Dwayne Barsotta wrote: you can make a custom dll of ui elements in xaml and code, then compile as a dll We have many WPF applications but they all use the same login DLL (or we sometimes include the project) which includes datasource, viemodel, view and code. So yes your IT guy is correct.
Never underestimate the power of human stupidity
RAH
|
|
|
|
|
Start here: [^]
For possible issues with mixing and matching WinForms and WPF UserControls:
[^]
|
|
|
|
|
Are there open source styles our frameworks that pretty much changes the entire look of elements?
I'd like to make applications that don't look exactly like the typical windows window? With out me having to remake common controls.
I'm also about to post a question about building UI elements.
|
|
|
|
|
I have to admit that I'm rather partial to the work done on MahApps[^]. Alternatively, there are some free WPF themes[^] available on CodePlex (you'll have to download the archive).
This space for rent
|
|
|
|
|
WPF styles "cascade"; from the application level; through to local assignments; down to the property level.
By refraining from setting any styles at a "low" level, you can influence the entire "theme" of an app by only (first) setting styles at the "application level", which will then cascade down to the lowest level.
e.g. Define the style of a "TextBox" at the app level, and the entire app will have a similar textbox style; while still being able to override at any level in the "visual tree" (of ui controls).
By limiting the setting of "background" and "forground" colors to "dynamic resources" (versus "static" resources) at the app level, I can give the user the ability to change theme colors on-the-fly from "summer" to "winter" (for example).
"(I) am amazed to see myself here rather than there ... now rather than then".
― Blaise Pascal
|
|
|
|
|
Google translate: Hello,
I practice on a program that gives me numbers and random letters. I am connected to a database SQLite which works perfectly but my current concern is that I can not print. In the data source I do not see Data Sqlite for me connected, the tutorials that I look at are those who program under vb2013, 2015 ... me I am on vb2008.
I would like to know how to make the data sqlite appear in my data source.
Cordially..
Original: Bonjour,
Je m'exerce sur un programme qui me donne des chiffres et lettres aléatoire. Je suis connecté à une base de donnée SQLite qui fonctionne parfaitement mais mon soucis actuel c'est que je n'arrive pas à imprimer. Dans la source de donnée je ne voit de Data Sqlite pour me connecté, les tutos que je regarde concerne ceux qui programme sous vb2013, 2015... moi je suis sur vb2008.
J'aimerais savoir comment faire apparaître le data sqlite dans ma source de donnée.
Cordialement..
|
|
|
|
|
This is an English language site, and we only accept questions and answers in that language: please use Google Translate in future to assist. I have added the translation to your question.
Ceci est un site en Anglais, et nous acceptons seulement les questions et réponses dans cette langue: s'il vous plaît utiliser Google Translate à l'avenir pour vous aider. J'ai ajouté la traduction à votre question.
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
Please excuse me for this error ...
|
|
|
|
|
No problem!
But I'm not sure I understand your question: it doesn't seem to have anything to do with printing?
Can you share any code which demonstrates the problem, and explain what it does that you didn't expect, or doesn't do that you did?
Sample data may also help as we don't have access to your screen, HDD, or database!
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
excuse me how do you send a screenshot? ...
I use the reaportView tool and you have to connect it to your database. I made a screenshot that I would like to introduce it to you
|
|
|
|
|
You can't post screenshots directly here - we have too many idiots who would post inappropriate material for that at present.
You can post then to dropbox and post a link - but generally a good explanation with sample data works better (we can't copy'n'paste from an image into a DB or Visual Studio for testing).
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
There is something that escapes me ...
This is the code for the form1
(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.Data.OleDb;
using System.Data.SQLite;
namespace Acode
{
public partial class Form1: Form
{
public Form1 ()
{
InitializeComponent ();
}
private SQLiteConnection sql_con;
private SQLiteCommand sql_cmd;
private SQLiteDataAdapter DB;
private DataSet DS = new DataSet ();
private DataTable DT = new DataTable ();
private void setConnection ()
{
sql_con = new SQLiteConnection (@ "Data Source = DBcode.db; Version = 3; New =; Compress = True;");
}
private void LoadData ()
{
SetConnection ();
sql_con.Open ();
sql_cmd = sql_con.CreateCommand ();
string CommandText = "select * from InfoCode";
DB = new SQLiteDataAdapter (CommandText, sql_con);
DS.Reset ();
DB.Fill (DS);
DT = DS.Tables [0];
dataGridView1.DataSource = DT;
sql_con.Close ();
}
private void Form1_Load (object sender, EventArgs e)
{
LoadData ();
}
private void ExecuteQuery (String txtQuery)
{
SetConnection ();
sql_con.Open ();
sql_cmd = sql_con.CreateCommand ();
sql_cmd.CommandText = txtQuery;
sql_cmd.ExecuteNonQuery ();
sql_con.Close ();
}
public static string randomstring (int length)
{
const string chars = "ABCDEFGHIJKLMNOPQRSTUVWYZ0123456789";
Random random = new Random ();
return new string (Enumerable.Repeat (floats, length) .Select (s => s [random.Next (s.Length)]). ToArray ());
}
private void btnGenerer_Click (object sender, EventArgs e)
{
lblDisplay.Text = randomstring (4);
txtAfficPrice.Text = "100";
}
private void button1_Click (object sender, EventArgs e)
{
lblDisplay.Text = randomstring (5);
txtAffichPrice.Text = "300";
}
private void button2_Click (object sender, EventArgs e)
{
lblDisplay.Text = randomstring (6);
txtAffichPrice.Text = "500";
}
private void btnRegister_Click (object sender, EventArgs e)
{
if (lblDisplay.Text == "")
{
MessageBox.Show ("Please generate the code");
}
else
{
string txtQuery = "insert into InfoCode (Code, DateCode, PriceCode) values ('" + lblDisplay.Text + "', '" + dateTimePicker1.Text + "', '" + txtAfficePrice.Text + "')";
ExecuteQuery (txtQuery);
LoadData ();
MessageBox.Show ("Registration completed successfully");
lblDisplay.Text = "";
groupBoxGenerer.Enabled = false;
btnSave.Enabled = false;
This.Refresh ();
}
}
private void btnAdd_Click (object sender, EventArgs e)
{
groupBoxGenerer.Enabled = true;
btnSave.Enabled = true;
}
private void exitToolStripMenuItem_Click (object sender, EventArgs e)
{
this.Close ();
}
private void codeSOLDToolStripMenuItem_Click (object sender, EventArgs e)
{
FrmCodeSold frmcodevended = new FrmCodeSold ();
frmcodevendu.Show ();
this.Hide ();
}
private void pointToolStripMenuItem_Click (object sender, EventArgs e)
{
FrmPointJournal pointQ = new FrmPointJournal ();
pointQ.Show ();
this.Hide ();
}
}
}
)
and I wish I could print all the recordings from there via another form
I have a faith done but with access and this faith I use SQlite but as I emphasize them I do not see the data SQlite in my data source.
|
|
|
|
|
For starters, never do this:
string txtQuery = "insert into InfoCode (Code, DateCode, PriceCode) values ('" + lblDisplay.Text + "', '" + dateTimePicker1.Text + "', '" + txtAfficePrice.Text + "')"; Never concatenate strings to build a SQL command. It leaves you wide open to accidental or deliberate SQL Injection attack which can destroy your entire database. Use Parametrized queries instead.
When you concatenate strings, you cause problems because SQL receives commands like:
SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood' The quote the user added terminates the string as far as SQL is concerned and you get problems. But it could be worse. If I come along and type this instead: "x';DROP TABLE MyTable;--" Then SQL receives a very different command:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable; Which SQL sees as three separate commands:
SELECT * FROM MyTable WHERE StreetAddress = 'x'; A perfectly valid SELECT
DROP TABLE MyTable; A perfectly valid "delete the table" command
And everything else is a comment.
So it does: selects any matching rows, deletes the table from the DB, and ignores anything else.
So ALWAYS use parameterized queries! Or be prepared to restore your DB from backup frequently. You do take backups regularly, don't you?
That won't solve your problem, but it's a major risk that you need to address immediately.
For the problem you have found, start with the debugger.
Put a breakpoint on the line
dataGridView1.DataSource = DT; and run your app. When it hits the breakpoint, have a close look at DT and see exactly what has been returned. How many columns? How many rows? What is in the actual cells?
As an aside, you need to look at your naming conventions:
private void ExecuteQuery (String txtQuery)
{
SetConnection ();
sql_con.Open ();
sql_cmd = sql_con.CreateCommand ();
sql_cmd.CommandText = txtQuery;
sql_cmd.ExecuteNonQuery (); In any code review, a method called ExecuteQuery which calls ExecuteNonQuery would be at target for abusive language!
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
Thank you for all these tips for me will be a pulse to my learning. it's in my research that I found but what do you recommend to me?
I correct this error before talking about printing or after?
|
|
|
|
|
I'd correct it first - if only because once you fix the other problem you probably won't "get around to it" otherwise!
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
Frankly thank you for giving me your time. give me a few minutes just the time for me to redo my connection and I come back to you.
|
|
|
|
|
Not a problem!
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
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.Data.OleDb;
using System.Data.SQLite;
namespace Acode
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private SQLiteConnection sql_con;
private SQLiteCommand sql_cmd;
private SQLiteDataAdapter DB;
private DataSet DS = new DataSet();
private DataTable DT = new DataTable();
private void setConnection()
{
sql_con = new SQLiteConnection(@"Data Source=DBcode.db; Version=3;New=;Compress=True;");
}
private void LoadData()
{
setConnection();
sql_con.Open();
sql_cmd = sql_con.CreateCommand();
sql_cmd.CommandText = "select * from InfoCode";
DB = new SQLiteDataAdapter(sql_cmd.CommandText, sql_con);
DS.Reset();
DB.Fill(DS);
DT = DS.Tables[0];
dataGridView1.DataSource = DT;
sql_con.Close();
}
private void Form1_Load(object sender, EventArgs e)
{
LoadData();
}
private void ExecuteQuery()
{
setConnection();
sql_con.Open();
sql_cmd = sql_con.CreateCommand();
sql_con.Close();
}
public static string randomstring(int length)
{
const string chars = "ABCDEFGHIJKLMNOPQRSTUVWYZ0123456789";
Random random = new Random();
return new string(Enumerable.Repeat(chars, length).Select(s => s[random.Next(s.Length)]).ToArray());
}
private void btnGenerer_Click(object sender, EventArgs e)
{
lblAffichage.Text = randomstring(4);
txtAffichPrix.Text = "100";
}
private void button1_Click(object sender, EventArgs e)
{
lblAffichage.Text = randomstring(5);
txtAffichPrix.Text = "300";
}
private void button2_Click(object sender, EventArgs e)
{
lblAffichage.Text = randomstring(6);
txtAffichPrix.Text = "500";
}
private void btnEnregistrer_Click(object sender, EventArgs e)
{
if (lblAffichage.Text =="")
{
MessageBox.Show("Merci de bien vouloir générer le code");
}
else
{
sql_cmd.CommandText = "insert into InfoCode (Code, DateCode, PrixCode) values('" + lblAffichage.Text + "' , '" + dateTimePicker1.Text + "' , '" + txtAffichPrix.Text + "')";
sql_cmd.ExecuteNonQuery();
LoadData();
MessageBox.Show("Enregistrement effectué avec succès");
lblAffichage.Text = "";
groupBoxGenerer.Enabled = false;
btnEnregistrer.Enabled = false;
this.Refresh();
}
}
private void btnAjouter_Click(object sender, EventArgs e)
{
groupBoxGenerer.Enabled = true;
btnEnregistrer.Enabled = true;
}
private void quitterToolStripMenuItem_Click(object sender, EventArgs e)
{
this.Close();
}
private void codeVenduToolStripMenuItem_Click(object sender, EventArgs e)
{
FrmCodeVendu frmcodevendu=new FrmCodeVendu();
frmcodevendu.Show();
this.Hide();
}
private void pointToolStripMenuItem_Click(object sender, EventArgs e)
{
FrmPointJournalier pointQ = new FrmPointJournalier();
pointQ.Show();
this.Hide();
}
}
}
I receive an error message: Database is not open
|
|
|
|
|
No, when I meant was "Don't concatenate strings" and "Parameterized queries" are teh important bit:
sql_cmd.CommandText = "insert into InfoCode (Code, DateCode, PrixCode) values('" + lblAffichage.Text + "' , '" + dateTimePicker1.Text + "' , '" + txtAffichPrix.Text + "')"; Is extremely dangerous, not the "wrong name" bit!
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
but what should I do? since you asked me to correct the error. can you tell me more so that I can understand
|
|
|
|