|
I take it flickering is acceptable now?
yes you now must paint while scrolling; I'd guess a panel1.Invalidate() should do it, Refresh() would be more expensive as it waits for the repaint to finish IIRC.
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read formatted code with indentation, so please use PRE tags for code snippets.
I'm not participating in frackin' Q&A, so if you want my opinion, ask away in a real forum (or on my profile page).
|
|
|
|
|
Ok I invalidated the panel on the Scroll event but it flickers allot when it move the scroll slider it just looks plain ugly ! Is there another way as its visual effects is the same as when I use "panel1.Refresh()" ?
Thanks for your help anyway I apologize for my incompetence xD
|
|
|
|
|
it is high time you describe your overall goal, and the set-up of your controls. How many panels (or other Controls) are there, what is their purpose and relationship? etc.
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read formatted code with indentation, so please use PRE tags for code snippets.
I'm not participating in frackin' Q&A, so if you want my opinion, ask away in a real forum (or on my profile page).
|
|
|
|
|
My goal is to create a simple control that can render a 2 dimensional grid.
Its inputs are (tilewidth,tileheight,rows,columns) and the idea is that it can somehow generate the images like a grid inside a panel which can be scrolled left,right, up and down. This should allow me to be able to create a grid that is larger than the form and scroll across it to see different tiles.
The problem with the one I made so far (with your assistance) is that it flickers when I scroll, on the "Scroll" event of the panel I force it to "Invalidate()" but this seems to make It flicker. If I do not use "Invalidate" or "Refresh" in the Scroll event of the panel then it does not show the updated grid that is drawn in the Paint event in the panel.
|
|
|
|
|
0.
I'm not sure I understand the role of the images in said grid. Is this a board game?
1.
You did not answer "How many panels (or other Controls) are there, what is their purpose and relationship?"
2.
Whatever approach, while scrolling, the view will update; and you could then complain for it to be sluggish i.e. not tracking your scroll movements fast enough, or flickering which may (or may not) mean it is following your scroll movement too nervously.
3.
From what you told, did you consider having a (large) DataGridView inside a (smaller) Panel, with Panel.AutoScroll=true?
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read formatted code with indentation, so please use PRE tags for code snippets.
I'm not participating in frackin' Q&A, so if you want my opinion, ask away in a real forum (or on my profile page).
|
|
|
|
|
0.
It is going to be used for a basic 2D Map editor so that I can make levels for games in XNA easier.
Each tile can have an image and various properties associated with it and as map sizes vary I could have one map at 50*50 tiles or another at 100*100 tiles (x,y)
1.
The panel is the only control running,its part of a custom control that can be dragged and dropped from the toolbox, literally just a panel component with features to render the grid using the System.Draw.
Its on a test form on its own, im testing it with a 100 * 100 tile grid at 32*32 width *height.
2.
I have played with the speed of which it scrolls, it appears that even a very small change in its scroll values cause the panel to flicker due to it being Invalidated() on the "Scroll" event of the panel.
3.
I dont know how a data-grid can help as this it visual drawing to the panel, im only drawing the grid to the panel as I need something that can scroll easily.
Hope this helps and thanks !
|
|
|
|
|
OK, I now have a better view on your app. Thanks.
So I take it your entire UserControl is showing (part of) the gridded map, and has its AutoScroll set true. I did some experiments with a Form holding a small autoscroll Panel which holds a much larger panel, and that seems to scroll quite well. Maybe you still have something causing lots of CPU cycles getting wasted, but I don't recall having seen so in your latest Paint handler.
Or is what you have shown only a simplified snippet, and some more expensive operations are also present?
BTW: I have no XNA experience, however I somehow do expect someone to pop in and tell you now to use XNA for this editor too.
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read formatted code with indentation, so please use PRE tags for code snippets.
I'm not participating in frackin' Q&A, so if you want my opinion, ask away in a real forum (or on my profile page).
|
|
|
|
|
Well this is my latest code:
using System.Drawing;
using System.Windows.Forms;
namespace TileMapper.Presentation.Controls
{
public partial class MapRenderer : UserControl
{
private Point _tileBound;
private Point _rowsColumns;
private bool _initalized = false;
Rectangle[,] _renderBounds;
public MapRenderer()
{
InitializeComponent();
this.DoubleBuffered = true;
this.SetStyle(
ControlStyles.OptimizedDoubleBuffer , true);
this.UpdateStyles();
panel1.HorizontalScroll.LargeChange = 1;
}
public void InitalizeGrid(int tileWidth, int tileHeight, int rows, int columns)
{
_tileBound = new Point(tileWidth, tileHeight);
_rowsColumns = new Point(rows, columns);
panel1.AutoScrollMinSize = new Size(_tileBound.X * _rowsColumns.X, _tileBound.Y * _rowsColumns.Y);
_initalized = true;
_pen = new Pen(Color.Black);
_tile = new Rectangle(0, 0, _tileBound.X, _tileBound.Y);
_im = Image.FromFile(@"C:/box.png");
_scrollValue = new Point(panel1.HorizontalScroll.Value, panel1.VerticalScroll.Value);
_renderBounds = new Rectangle[_tileBound.X, _tileBound.Y];
for (int x = 0; x < _tileBound.X; x++)
{
for (int y = 0; y < _tileBound.Y; y++)
{
_renderBounds[x,y] = new Rectangle(x * _tileBound.X
, y * _tileBound.Y, _tileBound.X, _tileBound.Y);
}
}
}
private Point _scrollValue;
Pen _pen;
Rectangle _tile;
private Image _im;
void DrawGrid(Graphics e, Rectangle bound)
{
int start = bound.X / _tileBound.X;
int end = bound.X/_tileBound.X + bound.Width/_tileBound.X;
int startY = bound.Y / _tileBound.Y;
int endY = bound.Y + bound.Height/_tileBound.Y;
for (int x = start; x < end; x++)
{
for (int y = startY; y < endY; y++)
{
e.DrawImage(_im, _renderBounds[x,y], _tile, GraphicsUnit.Pixel);
}
}
}
private void panel1_Paint_1(object sender, PaintEventArgs e)
{
if (_initalized)
{
Rectangle a = e.ClipRectangle;
_scrollValue.X = panel1.HorizontalScroll.Value;
_scrollValue.Y = panel1.VerticalScroll.Value;
DrawGrid(e.Graphics, a);
}
}
private void panel1_Scroll(object sender, ScrollEventArgs e)
{
panel1.Invalidate();
}
}
}
..>Designer code..
namespace TileMapper.Presentation.Controls
{
partial class MapRenderer
{
private System.ComponentModel.IContainer components = null;
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
private void InitializeComponent()
{
this.panel1 = new System.Windows.Forms.Panel();
this.SuspendLayout();
this.panel1.AutoScroll = true;
this.panel1.BackColor = System.Drawing.Color.White;
this.panel1.Location = new System.Drawing.Point(12, 24);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(583, 319);
this.panel1.TabIndex = 0;
this.panel1.Scroll += new System.Windows.Forms.ScrollEventHandler(this.panel1_Scroll);
this.panel1.Paint += new System.Windows.Forms.PaintEventHandler(this.panel1_Paint_1);
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.panel1);
this.Name = "MapRenderer";
this.Size = new System.Drawing.Size(612, 358);
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.Panel panel1;
}
}
|
|
|
|
|
OK, the one thing I would simplify is the Graphics.DrawImage; when you specify both source and destination rectangles it will perform a scaling, whereas you probably don't need one. Drawing an entire bitmap at some location can be handled swiftly by Graphics.DrawImage(image, x, y);
I am surprised your Panel is AutoScroll; your UserControl is too I assume (but I don't see that). As I said, (non-scrolling large) panel in small autoscrolling panel works fine for me, so I assume non-scrolling large panel in autoscrolling UserControl should too.
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read formatted code with indentation, so please use PRE tags for code snippets.
I'm not participating in frackin' Q&A, so if you want my opinion, ask away in a real forum (or on my profile page).
|
|
|
|
|
Thanks for your help I should be able to get it sorted !
|
|
|
|
|
You're welcome.
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read formatted code with indentation, so please use PRE tags for code snippets.
I'm not participating in frackin' Q&A, so if you want my opinion, ask away in a real forum (or on my profile page).
|
|
|
|
|
Sir/Mam
Sir i want to know in c# how to dynamically bind the data. After Selecting any node on right click it gives option like insert,edit,delete. on selecting insert option it data must be feeded to the database and reflect also on tree view control.
Thanks
|
|
|
|
|
|
Follow these instructions
get you data from the database formatted for loading into a treeview
populate the treeview placing either the ID or the datarow into the tag property
add a context menu to the treeview
handle the crud events
when Add then pop a dialog to get the information from the user
save the dialog information back to the database
reload the treeview from the database
Never underestimate the power of human stupidity
RAH
|
|
|
|
|
I am using pull method for viewing a crystal report. It works fine but it doesnt refresh the data..it still shows the old data.
so i wrote some code to refresh the data..but it is prompting me for password...wen we give password it works..but even wen i give that password in code, it is prompting..
below is my code
Dim rptDoc As New ReportDocument
rptDoc.Load("test.rpt")
ApplyInfo(rptDoc)
CrystalReportViewer1.ReportSource = rptDoc
Public Sub ApplyInfo(ByRef _oRpt As CrystalDecisions.CrystalReports.Engine.ReportDocument)
Dim oCRDb As CrystalDecisions.CrystalReports.Engine.Database = _oRpt.Database
Dim oCRTables As CrystalDecisions.CrystalReports.Engine.Tables = oCRDb.Tables
Dim oCRTable As CrystalDecisions.CrystalReports.Engine.Table
Dim oCRTableLogonInfo As CrystalDecisions.Shared.TableLogOnInfo
Dim oCRConnectionInfo As New CrystalDecisions.Shared.ConnectionInfo()
oCRConnectionInfo.DatabaseName = _dbName
oCRConnectionInfo.ServerName = _serverName
oCRConnectionInfo.UserID = _userID
oCRConnectionInfo.Password = _passWord
For Each oCRTable In oCRTables
oCRTableLogonInfo = oCRTable.LogOnInfo
oCRTableLogonInfo.ConnectionInfo = oCRConnectionInfo
oCRTable.ApplyLogOnInfo(oCRTableLogonInfo)
Next
End Sub
|
|
|
|
|
I had an issue similar to this awhile ago, i cant remember the exact code but you need to loop (Recursivly) through all the subreports and set the credentials for them aswell.
If at first you don't succeed ... post it on The Code Project and Pray.
|
|
|
|
|
hii
i want know that when we add any data source to the project it has two options
1. No, exclude sensitive data from the connection string, i will add in my application code
2. Yes, include sensitive data in my connection string
2nd option is nuthing anyone can use it but how to use the first option ???
how to add sensitive data in application code ???
how can i do that please provide any easy way as i didnt find it
Mohammad Barzanooni
|
|
|
|
|
|
Hello
I'm Using Bartender 9.2 SDK ,i need to print multiple labels format in the same page ,for example i'm using laser printer with A4 stickers papers (24 rows*6 columns)
which it means 144 label for every page ,my problem is when i print multiple labels format ,lets say the first format have 20 identical data that left the rest of page empty and start the new format in the next page which its waste my papers, I plan to print multiple separate .btw files(bartender label format) on the same paper here the code I'm using
Try
Dim copies As String
Dim price As String
Dim EXP As String
Dim ItemName As String
GetPharmacyName()
GetValuesFromGrid()
ReDim myarray(myarr.Length - 1)
myarr.CopyTo(myarray, 0)
Using btEngine As New Engine(True)
btEngine.Start()
For i = 0 To UBound(myarray)
If myarray(i) <> -1 Then
copies = dgvOrders.Item(3, myarray(i)).Value
price = GetPrice(dgvOrders.Item(0, myarray(i)).Value.ToString)
EXP = dgvOrders.Item(2, myarray(i)).Value.ToString
ItemName = dgvOrders.Item(1, myarray(i)).Value.ToString
Dim Barcode As String = GetID(dgvOrders.Item(0, myarray(i)).Value.ToString)
Dim btFormat As LabelFormatDocument = btEngine.Documents.Open("C:\Standard.btw")
'btFormat.PrintSetup.NumberOfSerializedLabels = 4
If copies <> 0 Then
btFormat.PrintSetup.IdenticalCopiesOfLabel = copies
btFormat.SubStrings("ID").Value = Barcode
btFormat.SubStrings("Pharmacy_Name").Value = Pharm_Name
btFormat.SubStrings("Price").Value = "Price: " & price & " SDG "
' btFormat.SubStrings("Pharmacy_Tel").Value = Tel
btFormat.SubStrings("EXP").Value = "EXP Date: " & EXP
btFormat.SubStrings("Item").Value = "Item : " & ItemName
' Print the label
Dim result As Result = btFormat.Print()
btFormat.Close(SaveOptions.DoNotSaveChanges)
End If
End If
Next i
btEngine.Stop(SaveOptions.SaveChanges)
End Using
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
Thanks
|
|
|
|
|
Your best source of information on this would be the people who wrote the library you're using. Here...[^]
It's very unlikely anyone here would have used the library or, if they did, would see your question any time soon.
|
|
|
|
|
thanks for response much appreciated
|
|
|
|
|
Hello,
i have a datagridview which shows a datatable per bindingsource.
Now i want to make in every row three buttons in the last cell to give my users the possibility to delete, edit or print the row.
Is this possible ?
I want 3 buttons in one cell, not three columns.
the Buttons should be little icons.
thanks so far
jogi
|
|
|
|
|
|
I've searched this forum and just simply can't find an answer already written out.
I am creating a user control using the designer. The control only paints stuff like lines and colors within its bounds using OnPaint and OnPaintBackground.
Now, I need to respond to mouse clicks, yet I cannot get the control to respond to any mouse clicks.
if I do Capture = true, then it will listen to 1 single event, and then Capture is lost and i cannot click again. When I do capture, the mouse cursor turns into an hourglass anyway, which I dont want.
How does one listen to events of a UserControl??? It seems this should work simply... but it does not. I am adding this control into a Table control which is in a form. There really isn't much more to it than that.
I have a deadline and I'm just stumped on something that should be so ridiculously simple... yet its not.
Here is the basic class I'm writing, its just a UserControl created from the visual designer. I've got breakpoints on all those mouse events and NOT ONE fires.
PLEASE HELP!
public partial class HomeHeader : UserControl
{
public HomeHeader()
{
InitializeComponent();
}
protected override void OnClick(EventArgs e)
{
base.OnClick(e);
}
protected override void OnMouseDoubleClick(MouseEventArgs e)
{
base.OnMouseDoubleClick(e);
}
protected override void OnMouseDown(MouseEventArgs e)
{
base.OnMouseDown(e);
}
protected override void OnMouseMove(MouseEventArgs e)
{
base.OnMouseMove(e);
}
protected override void OnMouseUp(MouseEventArgs e)
{
base.OnMouseUp(e);
}
}
|
|
|
|
|
Hi,
I have no trouble getting normal mouse events on a form holding two instances of this little UserControl1,
which holds a ListBox, a ComboBox and a Label. The Label text gets updated for the one UserControl1 instance my mouse is hovering over, as long as I'm not over one of its internal Controls (that's why I'm having the ListBox and ComboBox).
public partial class UserControl1 : UserControl {
public UserControl1() {
InitializeComponent();
}
private void log(string s) {
label1.Text=DateTime.Now.ToString("mm:ss.fff ")+s;
}
private void UserControl1_MouseMove(object sender, MouseEventArgs e) {
log("MouseMove");
}
or
public partial class UserControl1 : UserControl {
public UserControl1() {
InitializeComponent();
}
private void log(string s) {
label1.Text=DateTime.Now.ToString("mm:ss.fff ")+s;
}
protected override void OnMouseMove(MouseEventArgs e) {
log("MouseMove");
base.OnMouseMove(e);
}
}
The main difference with your code is my MouseMove handler contains real code, it does not just call base.OnMouseMove(). Instead it shows a little string in a label.
IMO base.OnMouseMove() does nothing by default, an empty UserControl simply has no functionality.
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read formatted code with indentation, so please use PRE tags for code snippets.
I'm not participating in frackin' Q&A, so if you want my opinion, ask away in a real forum (or on my profile page).
|
|
|
|
|