|
Ger Hayden wrote: wasn't aware of them
See point 7 in the Forum Guidelines[^].
Just say 'NO' to evaluated arguments for diadic functions! Ash
|
|
|
|
|
In the 24 hours since my original post I have made no progress and huge progress. None in that the problem persists, but I have learned volumes about how the combo column behaves.
Here is my original post:
My application reads bus routes into a combo column on a datagrid view. For each Route the Stages column is reloaded.
Each Passenger on Route 1 has its correct stage displayed, but the grid fails to show the stages for passengers on Route 2.
When I step through the code, I can see the Stage column reload and the correct stage picked from the list for Route 2, but its never shown. Not only that, it throws in the Datagrid View Default Error Dialog for good measure.
I am using VS2008, C++/CLI grid is entirely unbound and I am not employing datasoures, so setting displaymember/valuemember is not available to me.
void VTPassenger::frmPassengerMaster::Load_RouteStages(int arg_Route_ID)
{
dgStage->Items->Clear();
dgStage->Items->Add("0 <--- Undefined --->");
// then the Stages for this Route
List<CRouteStage^>^ RouteStageList = gcnew List<CRouteStage^>();
try
{
RouteStageList = CComs_RS::Fetch_RouteStage(m_LocalConnection,1,arg_Route_ID);
}
catch(Exception ^e)
{
String ^MessageString = " SQL Error retrieving Route Stages: " + e->Message;
MessageBox::Show(MessageString, "RouteStage Techincal Error");
return;
}
if (RouteStageList->Count == 0)// No records so no Ticket types defined
{
return;
}
for each(CRouteStage^ candidate in RouteStageList)
{
array<Object^>^ itemRec = gcnew array<Object^> {candidate->p_Stage_ID,
candidate->p_StageName
};
String^ AddString;
AddString = String::Format("{0} - {1}", candidate->p_Stage_ID, candidate->p_StageName);
this->dgStage->Items->Add(AddString);
}
}
And now for the progress.
This will work very well as is if the passenger list is sorted in route order, but do not consider this a suitable workaround. Learning that forced me to reflect on the design. For five hundered passengers distributed over a pair of short routes, 500 database visits doesnt make sense for essentially the same route stages - but what if there were 300 routes involved for our little outfit? Then front loading and holding 300 sets of route stages in a collection in memory doesn't sit well.
So programmatically I have created a datatable and read in my route stages upon which I attempted a filter in the sytle of spidernet's DataGridView FAQ bound in the code to the datatable, but changing the contents of the filter for each route change plus searching the list threw up issues.
So now I have two choices - a collection of filtered stage sets, one per route which will work well while the number of routes operated is low, or expand on my original idea but attempt to implement it a cell level - where I have just commenced research.
Ger
modified on Tuesday, November 30, 2010 11:51 PM
|
|
|
|
|
If users rarely make a selection from the combo then only request the data when the user edits the cell. This may or may not be acceptable.
You may also want to cache the results in a HashTable (route, collection of stages) so before you request the data, see if it already exists in the HashTable. If so, you will be able to access the data in the HashTable and avoid the round trip to the DB.
|
|
|
|
|
Thanks Robert.
I found an example that is very similar to your second suggestion. See my next post for details on how I applied it.
Ger
Ger
|
|
|
|
|
I have a textbox, a standard button and a toolstrip containing a couple of buttons.
In the validating event of the textbox i coded to check whether it is blank.
If yes then it shows a message 'Enter Value'. When the standard button is clicked while
the textbox is empty, it's validating properly and showing the message but when the
toolstripbutton is clicked it's not not validating the textbox and no message is being
shown. It seems that I gotto write the validation code explicitly in the
toolstripbutton_click event which is too troublesome when there are multiple textboxes
and toolstripbuttons on a single form. What I want to know is whether the
textbox_validating can be fired while the toolstripbutton is clicked?
Handling toolstrips is really a headache.
Please help. I'm badly in need of it. Regards.
|
|
|
|
|
This is an undocumented feature and appears to be by design. (don't you just hate that terminology) I guess it makes sense in a non-OOP way. When an event in the ToolStrip is raised, the control within the form that has focus, does not lose that focus! Therefore the validated/validating events of the control that has focus, are not raised.
The approach I take is to refactor each validation and provide a method that calls all validations within a single method. It's nice to provide control by control validation but there is no guarantee that a control will ever gain or lose focus. You need an overall validation method to handle this.
If your dealing with an underlying data source you may also want to look at the IDataErrorInfo interface.
|
|
|
|
|
priyamtheone wrote: Please help. I'm badly in need of it
Oh! your question will be more clear when you mention your code so please mention it.
whatever,
you can create a function and call it as many time you want to perform it. you don't need to create command every time for same work.
|
|
|
|
|
Well, calling common functionalities using methods is well known to everyone. That's not my question. What I asked for is whether textbox or other standard controls can be validated while toolstripbutton is clicked? As I learned gradually that toolstrip is not a control but a component and toolstripitems don't have CausesValidation property to cause them to validate any standard control on a form.
|
|
|
|
|
So, if you want to validate your TextBox, you have to call the method from within your ToolStripItem_Click event handler.
i.e. :
private myToolStripItem_Click(object sender, ClickEventArgs e)
{
myTextBox_LostFocus(myTextBox, EventArgs.Empty);
...
}
|
|
|
|
|
I wrote a small test form that allows the user to click on a control and then move the control to the desired location using mouse down and mouse up events. I have placed a groupbox on the form and then am dynamically creating a combox and placing it in the group box.
I can get it to move the control ok, but it does not end up in the position where the user lets up the mouse button. I am using PointToClient but it is not working. Here is the code:
public Form1()
{
InitializeComponent();
ComboBox cb = new ComboBox();
cb.Parent = groupBox;
cb.Location = new Point(60, 15);
cb.MouseDown +=new MouseEventHandler(cb_MouseDown);
cb.MouseUp +=new MouseEventHandler(cb_MouseUp);
}
private void cb_MouseDown (object sender, MouseEventArgs e )
{
Cursor = Cursors.SizeAll;
}
private void cb_MouseUp (object sender, MouseEventArgs e)
{
ComboBox cb = ((ComboBox) sender);
cb.Location = PointToClient (new Point(e.X, e.Y));
Cursor = Cursors.Default;
}
|
|
|
|
|
it ain't that simple. First of all, mouse events provide locations relative to the top lefthand corner of the control that reports the mouse actions, so any movement you want to accomplish needs at least to do the following:
finalLocation = originalLocation - mouseDownLocation + mouseUpLocation.
Furthermore, you have some functional shortcomings:
1.
you probably want to see the drag going on, which means you need MouseMove as well.
2.
when the mouse leaves the container, your container no longer gets mouse events, unless you have captured the mouse first.
3.
when you want context menus you need to process right-clicks; you then don't want to move the control I guess.
|
|
|
|
|
Thanks Luc! This is what I needeed.
|
|
|
|
|
Don't use location use Left and Top
private void cb_MouseUp(object sender, MouseEventArgs e)
{
ComboBox box = sender as ComboBox;
box.Left += e.X;
box.Top += e.Y;
Cursor = Cursors.Default;
}
If you're moving it from one container into another, You're going to have to work out which container and then remove control from original container and add to new container.
Sounds like fun
|
|
|
|
|
|
Sorry, I should have provided that link, I was aware of your excellent article on the subject...
|
|
|
|
|
No big deal.
I just hate it when I see people doing that and they all start by handling the mouse event of the form itself. There's an easier way!
|
|
|
|
|
When a button is focused by pressing Tab key, a rectangle appears on it. Even if the button's TabStop property is set to false, when the button is clicked with mouse the rectangle appears. Is it possible to stop the rectangle from appearing? Please help. Regards.
|
|
|
|
|
What exactly are you trying to do? The TabStop property only determines whether the control can be selected using the Tab key. Obviously using the mouse by passes that, so it is behaving as expected.
Do you perhaps want to disable the control (Enabled = false; ) or hide it (Visible = false; ) or just not provide user feedback that it's selected?
CQ de W5ALT
Walt Fair, Jr., P. E.
Comport Computing
Specializing in Technical Engineering Software
|
|
|
|
|
Owner-drawing?
..or the ImageButton from the VB PowerPack[^] - it has a ShowFocusRect property
By hiding the focus, the user won't know what control will be reacting to key-presses. It'd make a very confusing user-experience.
I are Troll
|
|
|
|
|
By inheriting the standard button class here's another solution I came up to:
class CustomButton : System.Windows.Forms.Button
{
private bool _DisplayFocusCues = true;
protected override bool ShowFocusCues
{
get
{
return _DisplayFocusCues;
}
}
public bool DisplayFocusCues
{
get
{
return _DisplayFocusCues;
}
set
{
_DisplayFocusCues = value;
}
}
}
Using this class you can set DisplayFocusCues at design time too.
|
|
|
|
|
Cool, didn't know that one yet. Would be a neat trick[^] to share
I are Troll
|
|
|
|
|
|
yup! that's one of the perfect way to set DisplayFocus at design time
|
|
|
|
|
Hi,
I have an editable datagridview that's been databound with dataadapter
and datatable, and a normal button on a form. When i edit the dgv's
cells and click the save button it fires the
datagridview_cellvalidating event and if the cell validation is correct
it updates and saves the current record to the datasource. Also, before
save it commits change in any cell under editing.
But when I use a toolstripbutton to do the same work, though it saves
the dgv records but doesn't update the current change i.e. it saves the
old records that are being fetched when the dgv was populated first
during form load. Also, clicking the toolstripbutton doesn't fire
datagridview_cellvalidating, datagridview_rowvalidating etc events.
What it seems to be is it's not commiting the change in any cell under
editing. Example-
Dgv While load:
CustomerID Customer Inactive
________________________________________
C01 Max Yes
C02 John No
C03 Alex Yes
Dgv while edit but before clicking toolstrip save button:
CustomerID Customer Inactive
________________________________________
C01 Max Yes
C02 Tim Yes
C03 Alex Yes
Dgv after clicking the toolstrip save button:
CustomerID Customer Inactive
________________________________________
C01 Max Yes
C02 John No
C03 Alex Yes
Why isn't it happening and how can I make it work? Please Help. Please
also let me know how can I fire datagridview_cellvalidating,
datagridview_rowvalidating and other events; and commit cell value
change by clicking toolstripbutton. Regards.
|
|
|
|
|
use dataGridView.CommitEdit() or EndEdit() to update the cell value as first thing on button click.
These function may also cause your validation events to fire (but I am not 100 % on that)
Life goes very fast. Tomorrow, today is already yesterday.
|
|
|
|