I followed your steps, of course without using a class, now the move function determines whether to draw a new rectangle or move it, but the moving action is not happening. Resizing we will back to it later:
publicpartialclass Form3 : Form
int x = 0;
int y = 0;
int height = 0;
int width = 0;
bool m_mouseDown = false;
bool m_movingRect = false;
Pen rectPen = new Pen(Color.Red, 1);
this.DoubleBuffered = true;
privatevoid pictureBox1_Paint(object sender, PaintEventArgs e)
Graphics gObj = e.Graphics;
rect = new Rectangle(x, y, height, width);
rectPen.DashStyle = DashStyle.Dash;
privatevoid pictureBox1_MouseDown(object sender, MouseEventArgs e)
m_mouseDown = true;
// Moving rectangleif (rect.Contains(e.Location))
m_movingRect = true;
StartXY = e.Location;
privatevoid pictureBox1_MouseMove(object sender, MouseEventArgs e)
this.Cursor = Cursors.SizeAll;
elsethis.Cursor = Cursors.Default;
if (m_mouseDown && rect.Contains(e.Location))
rect.X += e.X - StartXY.X; // <---- it is calculated correctly but doesn't update rectangle position
rect.Y += e.Y - StartXY.Y;
StartXY = e.Location;
Console.WriteLine("pictureBox1_MouseMove StartXY " + StartXY.X);
Console.WriteLine("pictureBox1_MouseMove StartXY " + StartXY.Y);
Console.WriteLine("pictureBox1_MouseMove rect " + rect.X);
Console.WriteLine("pictureBox1_MouseMove rect " + rect.Y);
if (m_mouseDown && !rect.Contains(e.Location))
EndXY = e.Location;
x = Math.Min(StartXY.X, EndXY.X);
y = Math.Min(StartXY.Y, EndXY.Y);
height = Math.Abs(StartXY.X - EndXY.X);
width = Math.Abs(StartXY.Y - EndXY.Y);
//Console.WriteLine("pictureBox1_MouseMove XXXX: " + " --- " + e.X.ToString());//Console.WriteLine("pictureBox1_MouseMove YYYY: " + " --- " + e.Y.ToString());
privatevoid pictureBox1_MouseUp(object sender, MouseEventArgs e)
EndXY = e.Location;
m_mouseDown = false;
m_movingRect = false;
you have too many variables, this is called data redundancy. In particular you have both x,y,width,height and rect; in some parts you operate on x,y in others on rect.X and rect.Y, and that is why it does not behave as you would hope.
The rule is: avoid redundancy; there isn't anything positive about redundancy, it adds variables and code, and it just makes it harder to pinpoint logic errors.
Using a separate class helps in achieving this, or at least makes it harder to break the rule.
To make matters worse, you change your data model (your "business logic") inside the Paint handler, where it says rect=new Rectangle(x,...).
You should never modify your business model inside a Paint handler; a Paint handler should behave as an observer, and not as a participant.
Reason: you don't know when a Paint handler will be executed:
(a) calling Invalidate tells the system your business model has changed and a repaint is required, so a repaint message is queued, but not executed right away (e.g. several calls to Invalidate may result in a single repaint);
(b) a Paint handler will also run when something happened to your window, e.g. when a pop-up dialog (may be from another app or from Windows itself) temporarily had hidden (part of) your window.
The only kind of variables your Paint handler should ever modify are the ones that are needed by the Paint handler itself, so it would be OK to write if (pen==null) pen=new Pen(Color.Red); assuming pen isn't part of your business stuff.
I counted the number of lines in your code and mine, excluding empty lines, lines with a single bracket, comments, and Console.WriteLine lines; my code (Form+Rect) is 43 lines, yours 50. Which tells me using a class is the right way to go: it does not add to the code, and it supports what is known as "separation of concerns": let each piece of code take care of what matters to it without being troubled with details that don't matter there. Example: my form tells the Rect to paint itself or to move itself without caring how that is done, whereas the Rect knows how to paint or move itself without knowing why it should.
Thanks for reply Luc...but the problem happens in the SQL command, when compare the field data (from the database) with the DataGridView cell that contains a date (sorry for the bad English...)...it returns error : "Wrong data type in criteria"
I don't know how to write the comparison...
the line is :
cmd.CommandText = @"update TabFx set Ferx =@fer, Descrip=@descr where Ferx="
You can use a parameter in the WHERE part of your SQL statement just like you do in the SET part, so it could look like
CommandText = "... WHERE Ferx=@Ferx";
Warning: IIRC you must provide the parameters (i.e. the calls to AddWithValue and the like) in the same order as the parameters appear in your SQL statement, since OleDb+Access does not really care about the parameter names!
I have a WinSCP Directory and have files in it. I need to get the date as 01_MMM (MMM represents the current month example- 01_APR and for May it should return 01_MAY so on and so forth) and I need to append this string '01_MMM' to the name of the file.
Please let me know how can I achieve that using C# Only.
// Setup session options
SessionOptions sessionOptions = new SessionOptions
Protocol = Protocol.Sftp,
HostName = "ap*****",
UserName = "****",
Password = "******",
SshHostKeyFingerprint = "*******"
using (Session session = new Session())
session.ExecutablePath = @"WinSCP.exe path";
List<RemoteFileInfo> files =
MonitorDirectory, FileSearchPattern, EnumerationOptions.None)
DateTime now = DateTime.Today;
ReportMonth = now.ToString("MMM").ToUpper();
foreach (RemoteFileInfo fileInfo in files)
------------------------------have to do renaming of the file here---------------------------
if (fileInfo.Length > ThresholdValue)
FileModifiedDate = fileInfo.LastWriteTime.ToString("yyyyMM", CultureInfo.InvariantCulture);
if (GetReportDateYM == FileModifiedDate || fileInfo.FullName.Contains(ReportMonth))
FileName = fileInfo.FullName;
Dts.Variables["User::FileName"].Value = FileName;
Dts.Variables["User::FileDate"].Value = FileModifiedDate;
Dts.TaskResult = (int)ScriptResults.Success;
So here I have a directory in remote server and I am accessing it through WinSCP tool. requirement is to rename the files insider this remote directory. I can read each and every file name but I am not able to find rename function here.
I am sorry by now, I want to use Multicombobox in datagridview,
I have access file have two table :ItemAll, Pur in acccess file.Column Items in datagridview1 is Combobox,
1- I want to create column of items as multicombobox ,when click on culumn Items , its doplist table ItemAll have two column :Items,NameItem.
2-In datagridview , when click multicombobox anh selcect Items column in combobox , In columm datagridview will receive data . I have added Multicombobox.cs, MulticomboboxPopup in project, I use dataset ACCSDataset.
I am programing and application for work which requires a certain level of access rights to users. Once logged in I get the access level number 1-10 which is then put onto a splash screen in a hidden txt box.
on the closure of the splash screen i would like it to go to a menu for that access right.
This is the code I am usingprivatevoid tmr_splash_Tick(object sender, EventArgs e)
if (prb_splash.Value == 100)
if (prb_splash.Value == 100)
if (prb_splash.Value == 100 & (!txt_number.Text.Contains("10")))
frm_Artemis_admin aa = new frm_Artemis_admin();
elseif (prb_splash.Value == 100 & (!txt_number.Text.Contains("09")))
frm_Employees_edit aa = new frm_Employees_edit();
The application runs but even though I have changed the access rights to 9 to test it its still going to the admin menu?
If anyone can help that would be great.
Many Thanks :)
This is going to be dependent on data to a large degree - and we don't have any access to that.
So, it's going to be up to you.
Fortunately, you have a tool available to you which will help you find out what is going on: the debugger. If you don't know how to use it then a quick Google for "Visual Studio debugger" should give you the info you need.
Put a breakpoint on the first line in the function, and run your code through the debugger. Then look at your code, and at your data and work out what should happen manually. Then single step each line checking that what you expected to happen is exactly what did. When it isn't, that's when you have a problem, and you can back-track (or run it again and look more closely) to find out why.
Sorry, but we can't do that for you - time for you to learn a new (and very, very useful) skill: debugging!
"I have no idea what I did, but I'm taking full credit for it." - ThisOldTony
AntiTwitter: @DalekDave is now a follower!