I've started working with Windows Workflow Rulesets to apply dynamically apply business rules to some internal processes. This involves using External RuleSet Toolset from Microsoft samples (some more on that in a later post)
One of the biggest peeves about the RuleSetDialog is its inability to resize. Viewing a complex rule in a three line window is very uncomfortable. It is, however, pretty easy to tweak the dialog and make it a lot more user friendly.
External RuleSet editor comes in source code. Open the code using Visual Studio, open the code for the RuleSetEditor form and find the editButton_Click event. What you'll may notice is that the RuleSetDialog class used derives from Dialog. Add a new function that will adjust the dialog to make it resizable.
private void TweakRuleSetDialogToResizable(RuleSetDialog ruleSetDialog) { ruleSetDialog.FormBorderStyle = FormBorderStyle.Sizable; ruleSetDialog.HelpButton = false; ruleSetDialog.MaximizeBox = true; ruleSetDialog.Controls["okCancelTableLayoutPanel"].Anchor = AnchorStyles.Right | AnchorStyles.Bottom; ruleSetDialog.Controls["rulesGroupBox"].Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Right; ruleSetDialog.Controls["ruleGroupBox"].Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Right | AnchorStyles.Bottom; ruleSetDialog.Controls["ruleGroupBox"].Controls["thenTextBox"].Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Right | AnchorStyles.Bottom; ruleSetDialog.Controls["ruleGroupBox"].Controls["elseLabel"].Anchor = AnchorStyles.Left | AnchorStyles.Bottom; ruleSetDialog.Controls["ruleGroupBox"].Controls["elseTextBox"].Anchor = AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Bottom; ruleSetDialog.Controls["ruleGroupBox"].Controls["conditionTextBox"].Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Right; ruleSetDialog.Controls["rulesGroupBox"].Controls["panel1"].Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Right; ruleSetDialog.Controls["rulesGroupBox"].Controls["panel1"].Controls["chainingBehaviourComboBox"].Anchor = AnchorStyles.Top | AnchorStyles.Right; ruleSetDialog.Controls["rulesGroupBox"].Controls["panel1"].Controls["chainingLabel"].Anchor = AnchorStyles.Top | AnchorStyles.Right; }
Then call the function passing the RuleSetDialog before it is display from the editButton_Click event.
RuleSetDialog ruleSetDialog = new RuleSetDialog(selectedRuleSetData.Activity, null, selectedRuleSetData.RuleSet); //Tweak the RuleSetDialog TweakRuleSetDialogToResizable(ruleSetDialog); DialogResult result = ruleSetDialog.ShowDialog();
Great stuff - Thanks very much. I really hate the RuleSetDialog.
ReplyDeleteAt last! Hurray!
ReplyDeleteMany thanks for your solution. I've extended it to perform some dynamic layout so that the if/then/else text boxes remain the same size:
private void MakeRuleSetDialogResizable(RuleSetDialog ruleSetDialog)
{
ruleSetDialog.FormBorderStyle = FormBorderStyle.Sizable;
ruleSetDialog.HelpButton = false;
ruleSetDialog.MaximizeBox = true;
ruleSetDialog.Controls["okCancelTableLayoutPanel"].Anchor = AnchorStyles.Right | AnchorStyles.Bottom;
ruleSetDialog.Controls["rulesGroupBox"].Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Right;
ruleSetDialog.Controls["ruleGroupBox"].Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Right | AnchorStyles.Bottom;
ruleSetDialog.Controls["ruleGroupBox"].Layout += new LayoutEventHandler(this.RulesGroupBox_Layout);
ruleSetDialog.Controls["rulesGroupBox"].Controls["panel1"].Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Right;
ruleSetDialog.Controls["rulesGroupBox"].Controls["panel1"].Controls["chainingBehaviourComboBox"].Anchor = AnchorStyles.Top | AnchorStyles.Right;
ruleSetDialog.Controls["rulesGroupBox"].Controls["panel1"].Controls["chainingLabel"].Anchor = AnchorStyles.Top | AnchorStyles.Right;
}
private void RulesGroupBox_Layout(object sender, LayoutEventArgs e)
{
int topOffset = 80;
int padding = 20;
int leftMargin = 10;
int labelHeight = 17;
int textBoxHeight = (e.AffectedControl.Size.Height - topOffset) / 3;
int textBoxWidth = e.AffectedControl.Size.Width - 20;
Control conditionTextBox = e.AffectedControl.Controls["conditionTextBox"];
if (conditionTextBox != null)
{
conditionTextBox.SetBounds(leftMargin, topOffset, textBoxWidth, textBoxHeight - padding);
}
Control conditionLabel = e.AffectedControl.Controls["conditionLabel"];
if (conditionLabel != null)
{
conditionLabel.SetBounds(leftMargin, topOffset - labelHeight, textBoxWidth, labelHeight);
}
Control thenTextBox = e.AffectedControl.Controls["thenTextBox"];
if (thenTextBox != null)
{
thenTextBox.SetBounds(leftMargin, textBoxHeight + topOffset, textBoxWidth, textBoxHeight - padding);
}
Control thenLabel = e.AffectedControl.Controls["thenLabel"];
if (thenLabel != null)
{
thenLabel.SetBounds(leftMargin, textBoxHeight + topOffset - labelHeight, textBoxWidth, labelHeight);
}
Control elseTextBox = e.AffectedControl.Controls["elseTextBox"];
if (elseTextBox != null)
{
elseTextBox.SetBounds(leftMargin, (textBoxHeight * 2) + topOffset, textBoxWidth, textBoxHeight - padding);
}
Control elseLabel = e.AffectedControl.Controls["elseLabel"];
if (elseLabel != null)
{
elseLabel.SetBounds(leftMargin, (textBoxHeight * 2) + topOffset - labelHeight, textBoxWidth, labelHeight);
}
}
For a complete solution that provides proportional resizing of all controls within the dialog, please visit
ReplyDeleteWorkflow Foundation - Resizing the RuleSetDialog
Regards, Chris.