Keep forgetting I can only post image files... so I'll post the code in code blocks.
class RuleVisualItem
using
System;
using
System.Drawing;
using
System.Windows.Forms;
using
Telerik.WinControls.Layouts;
using
Telerik.WinControls.UI;
namespace
_1152220
{
public
class
RuleVisualItem : SimpleListViewVisualItem
{
private
RadTextBoxControlElement _idElement;
private
RadTextBoxControlElement _sequenceElement;
private
RadTextBoxControlElement _nameElement;
private
RadTextBoxControlElement _ruleTextElement;
private
StackLayoutPanel _vStackLayout;
private
StackLayoutPanel _stackLayout;
protected
override
void
CreateChildElements()
{
base
.CreateChildElements();
_stackLayout =
new
StackLayoutPanel
{
Orientation = Orientation.Horizontal,
ShouldHandleMouseInput =
false
,
NotifyParentOnMouseInput =
true
};
_vStackLayout =
new
StackLayoutPanel
{
Orientation = Orientation.Vertical,
ShouldHandleMouseInput =
false
,
NotifyParentOnMouseInput =
true
};
_sequenceElement =
new
RadTextBoxControlElement
{
Text =
""
,
IsReadOnly =
true
,
MinSize =
new
Size(60, 0)
};
_stackLayout.Children.Add(_sequenceElement);
_idElement =
new
RadTextBoxControlElement
{
Text =
""
,
IsReadOnly =
true
,
MinSize =
new
Size(60, 0)
};
_stackLayout.Children.Add(_idElement);
_nameElement =
new
RadTextBoxControlElement
{
Text =
""
,
IsReadOnly =
true
,
MinSize =
new
Size(120, 0),
};
_stackLayout.Children.Add(_nameElement);
_ruleTextElement =
new
RadTextBoxControlElement
{
Text =
""
,
//TextWrap = true,
Multiline =
true
,
//IsReadOnly = true,
ShouldHandleMouseInput =
true
,
NotifyParentOnMouseInput =
false
};
_vStackLayout.Children.Add(_stackLayout);
_vStackLayout.Children.Add(_ruleTextElement);
Children.Add(_vStackLayout);
}
protected
override
void
SynchronizeProperties()
{
if
(Data ==
null
)
return
;
base
.SynchronizeProperties();
Text =
""
;
// must clear the textboxes or the info in them will be scrambled
_idElement.Text =
""
;
_sequenceElement.Text =
""
;
_nameElement.Text =
""
;
_ruleTextElement.Text =
""
;
_idElement.Text = Convert.ToString(Data[
"RuleItemId"
]);
_sequenceElement.Text = Convert.ToString(Data[
"Sequence"
]);
_nameElement.Text = Convert.ToString(Data[
"Name"
]);
var ruleItemText = Convert.ToString(Data[
"RuleItemText"
]);
_ruleTextElement.Text = ruleItemText;
}
protected
override
Type ThemeEffectiveType =>
typeof
(SimpleListViewVisualItem);
}
}
class RuleItemVisualItemDef
using
System.ComponentModel;
using
System.Runtime.CompilerServices;
using
_1152220.Annotations;
namespace
_1152220
{
public
class
RuleItemVisualItemDef : INotifyPropertyChanged
{
private
long
_ruleItemId;
private
long
_sequence;
private
string
_name;
private
string
_ruleItemText;
public
long
RuleItemId
{
get
{
return
_ruleItemId; }
set
{
if
(value == _ruleItemId)
return
;
_ruleItemId = value;
OnPropertyChanged();
}
}
public
long
Sequence
{
get
{
return
_sequence; }
set
{
if
(value == _sequence)
return
;
_sequence = value;
OnPropertyChanged();
}
}
public
string
Name
{
get
{
return
_name; }
set
{
if
(value == _name)
return
;
_name = value;
OnPropertyChanged();
}
}
public
string
RuleItemText
{
get
{
return
_ruleItemText; }
set
{
if
(value == _ruleItemText)
return
;
_ruleItemText = value;
OnPropertyChanged();
}
}
public
event
PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected
virtual
void
OnPropertyChanged([CallerMemberName]
string
propertyName =
null
)
{
PropertyChanged?.Invoke(
this
,
new
PropertyChangedEventArgs(propertyName));
}
}
}
class RadForm1
using
System;
using
System.Collections.Generic;
using
System.ComponentModel;
using
System.Text;
using
Telerik.WinControls.UI;
namespace
_1152220
{
public
partial
class
RadForm1 : Telerik.WinControls.UI.RadForm
{
private
BindingList<RuleItemVisualItemDef> _dataSource;
private
List<DummyData> _ruleItemDefs;
public
RadForm1()
{
InitializeComponent();
lstvwRuleItems.AllowArbitraryItemHeight =
true
;
lstvwRuleItems.AllowEdit =
false
;
lstvwRuleItems.AllowRemove =
false
;
lstvwRuleItems.ViewType = ListViewType.ListView;
_ruleItemDefs =
new
List<DummyData>();
for
(
int
i = 1; i < 5; i++)
{
_ruleItemDefs.Add(
new
DummyData
{
Name = $
"Rule {i}"
,
RuleItemId = i * 10,
Sequence = i
});
}
//lstvwRuleItems.ViewType = Telerik.WinControls.UI.ListViewType.DetailsView;
//lstvwRuleItems.DataSource = GetTable();
SetViewContents();
}
private
void
SetViewContents()
{
txtRuleHeading.Text = GetRuleItemHeading();
_dataSource =
new
BindingList<RuleItemVisualItemDef>();
_ruleItemDefs.ForEach(def => _dataSource.Add(
new
RuleItemVisualItemDef
{
RuleItemId = def.RuleItemId,
Sequence = def.Sequence,
Name = def.Name,
RuleItemText = GetRuleItemTextFor(def),
}));
lstvwRuleItems.DataSource =
null
;
lstvwRuleItems.DataSource = _dataSource;
}
private
string
GetRuleItemTextFor(DummyData def)
{
// this one usually works
//return LoremIpsum(minWords: 0, maxWords: 10, minSentences: 1, maxSentences: 5, numParagraphs: 4);
// this one usually fails (re-run the app if it doesn't)
return
LoremIpsum(minWords: 10, maxWords: 30, minSentences: 3, maxSentences: 10, numParagraphs: 4);
}
private
string
GetRuleItemHeading()
{
return
"some heading"
;
}
//static DataTable GetTable()
//{
// DataTable table = new DataTable();
// table.Columns.Add("bool", typeof(bool));
// table.Columns.Add("Drug", typeof(string));
// table.Columns.Add("Name", typeof(string));
// table.Columns.Add("Date", typeof(DateTime));
// table.Rows.Add(false, "Indocin", "David", DateTime.Now);
// table.Rows.Add(false, "Enebrel", "Sam", DateTime.Now);
// table.Rows.Add(false, "Hydralazine", "Christoff", DateTime.Now);
// table.Rows.Add(false, "Combivent", "Janet", DateTime.Now);
// table.Rows.Add(false, "Dilantin", "Melanie", DateTime.Now);
// return table;
//}
//private void radButton1_Click(object sender, EventArgs e)
//{
// lstvwRuleItems.DataSource = null;
// lstvwRuleItems.DataSource = GetTable();
//}
string
LoremIpsum(
int
minWords,
int
maxWords,
int
minSentences,
int
maxSentences,
int
numParagraphs)
{
var words =
new
[]{
"lorem"
,
"ipsum"
,
"dolor"
,
"sit"
,
"amet"
,
"consectetuer"
,
"adipiscing"
,
"elit"
,
"sed"
,
"diam"
,
"nonummy"
,
"nibh"
,
"euismod"
,
"tincidunt"
,
"ut"
,
"laoreet"
,
"dolore"
,
"magna"
,
"aliquam"
,
"erat"
};
var rand =
new
Random();
int
numSentences = rand.Next(maxSentences - minSentences)
+ minSentences + 1;
int
numWords = rand.Next(maxWords - minWords) + minWords + 1;
StringBuilder result =
new
StringBuilder();
for
(
int
p = 0; p < numParagraphs; p++)
{
result.Append(
"<p>"
);
for
(
int
s = 0; s < numSentences; s++)
{
for
(
int
w = 0; w < numWords; w++)
{
if
(w > 0) { result.Append(
" "
); }
result.Append(words[rand.Next(words.Length)]);
}
result.Append(
". "
);
}
result.Append(
"</p>"
);
}
return
result.ToString();
}
private
void
lstvwRuleItems_VisualItemCreating(
object
sender, Telerik.WinControls.UI.ListViewVisualItemCreatingEventArgs e)
{
if
(
this
.lstvwRuleItems.ViewType == ListViewType.ListView)
{
e.VisualItem =
new
RuleVisualItem();
}
}
}
internal
class
DummyData
{
public
long
RuleItemId {
get
;
set
; }
public
long
Sequence {
get
;
set
; }
public
string
Name {
get
;
set
; }
}
}
RadForm1.Designer.cs
namespace
_1152220
{
partial
class
RadForm1
{
/// <summary>
/// Required designer variable.
/// </summary>
private
System.ComponentModel.IContainer components =
null
;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected
override
void
Dispose(
bool
disposing)
{
if
(disposing && (components !=
null
))
{
components.Dispose();
}
base
.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private
void
InitializeComponent()
{
this
.txtRuleHeading =
new
Telerik.WinControls.UI.RadTextBox();
this
.lstvwRuleItems =
new
Telerik.WinControls.UI.RadListView();
((System.ComponentModel.ISupportInitialize)(
this
.txtRuleHeading)).BeginInit();
((System.ComponentModel.ISupportInitialize)(
this
.lstvwRuleItems)).BeginInit();
((System.ComponentModel.ISupportInitialize)(
this
)).BeginInit();
this
.SuspendLayout();
//
// txtRuleHeading
//
this
.txtRuleHeading.Dock = System.Windows.Forms.DockStyle.Top;
this
.txtRuleHeading.Location =
new
System.Drawing.Point(0, 0);
this
.txtRuleHeading.Name =
"txtRuleHeading"
;
this
.txtRuleHeading.Size =
new
System.Drawing.Size(684, 20);
this
.txtRuleHeading.TabIndex = 0;
//
// lstvwRuleItems
//
this
.lstvwRuleItems.Dock = System.Windows.Forms.DockStyle.Fill;
this
.lstvwRuleItems.Location =
new
System.Drawing.Point(0, 20);
this
.lstvwRuleItems.Name =
"lstvwRuleItems"
;
this
.lstvwRuleItems.Size =
new
System.Drawing.Size(684, 456);
this
.lstvwRuleItems.TabIndex = 1;
this
.lstvwRuleItems.VisualItemCreating +=
new
Telerik.WinControls.UI.ListViewVisualItemCreatingEventHandler(
this
.lstvwRuleItems_VisualItemCreating);
//
// RadForm1
//
this
.AutoScaleDimensions =
new
System.Drawing.SizeF(6F, 13F);
this
.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this
.ClientSize =
new
System.Drawing.Size(684, 476);
this
.Controls.Add(
this
.lstvwRuleItems);
this
.Controls.Add(
this
.txtRuleHeading);
this
.Name =
"RadForm1"
;
//
//
//
this
.RootElement.ApplyShapeToControl =
true
;
this
.Text =
"RadForm1"
;
((System.ComponentModel.ISupportInitialize)(
this
.txtRuleHeading)).EndInit();
((System.ComponentModel.ISupportInitialize)(
this
.lstvwRuleItems)).EndInit();
((System.ComponentModel.ISupportInitialize)(
this
)).EndInit();
this
.ResumeLayout(
false
);
this
.PerformLayout();
}
#endregion
private
Telerik.WinControls.UI.RadTextBox txtRuleHeading;
private
Telerik.WinControls.UI.RadListView lstvwRuleItems;
}
}