[Mono-bugs] [Bug 664831] New: Inconsistent Binding.ReadValue behaviour when binding hasn't begun
bugzilla_noreply at novell.com
bugzilla_noreply at novell.com
Sun Jan 16 17:14:58 EST 2011
https://bugzilla.novell.com/show_bug.cgi?id=664831
https://bugzilla.novell.com/show_bug.cgi?id=664831#c0
Summary: Inconsistent Binding.ReadValue behaviour when binding
hasn't begun
Classification: Mono
Product: Mono: Class Libraries
Version: 2.6.x
Platform: x86
OS/Version: Windows 7
Status: NEW
Severity: Normal
Priority: P5 - None
Component: Windows.Forms
AssignedTo: mono-bugs at lists.ximian.com
ReportedBy: cvolzke at live.com.au
QAContact: mono-bugs at lists.ximian.com
Found By: ---
Blocker: ---
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US)
AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.1.249.1036 Safari/532.5
When calling Binding.ReadValue() when binding hasn't begun, ms.net sets a null
(or default) value on the control whereas mono sets a value from the data
source.
Reproducible: Always
Steps to Reproduce:
Unit test to reproduce:
[Test]
public void Test_ReadValueWhenNotBinding()
{
TestDataSource dataSource = new TestDataSource();
dataSource.IntProperty = 10;
Control.ControlValue = 10;
var binding = Control.DataBindings.Add("ControlValue", dataSource,
"IntProperty");
AssertEquals(10, Control.ControlValue, "Pre-condition");
binding.ReadValue();
AssertEquals(0, Control.ControlValue, "Null or default value should be set
on the data source");
}
TestControl control;
TestControl Control
{
get { return control ?? (control = new TestControl()); }
}
class TestControl : Control
{
public event EventHandler ControlValueChanged;
public int ControlValue
{
get
{
int result;
int.TryParse(Text, out result);
return result;
}
set
{
Text = value.ToString();
if (ControlValueChanged != null)
{
ControlValueChanged(this, EventArgs.Empty);
}
}
}
}
Actual Results:
Unit test fails
Expected Results:
Unit test should pass, as it does with ms.net.
These changes fix the issue and cause the test above to pass.
Code added to Binding.PushData:
try {
data = FormatData (data);
if (!IsBinding) // line added
data = null; // line added
SetControlValue (data);
} catch (Exception e) {
Code added to Binding.PushData:
void PushData (bool force)
{
if (manager != null && (manager.Count == 0 || manager.Position == -1))
// line added
SetControlValue(null); // line added
if (manager == null || manager.IsSuspended || manager.Count == 0 ||
manager.Position == -1)
return;
Code added to Binding.SetPropertyValue
private void SetPropertyValue (object data)
{
PropertyDescriptor pd = TypeDescriptor.GetProperties
(manager.Current).Find (binding_member_info.BindingField, true);
if (pd.IsReadOnly)
return;
data = ParseData (data, pd.PropertyType);
pd.SetValue(manager.Current,
pd.PropertyType != typeof(object) && data is DBNull ? null : //
this line of the statement added
data);
}
--
Configure bugmail: https://bugzilla.novell.com/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the QA contact for the bug.
You are the assignee for the bug.
More information about the mono-bugs
mailing list