'Column xxx does not allow nulls' error when control is bound and value was entered

  • Thread starter Thread starter dbuchanan
  • Start date Start date
D

dbuchanan

Hello,

I have encoutered the error show below after attempting to save a new
record. This happens about 90% of the time under a set of conditions
described later below.

The main form contains a dataGridView and a button on that form opens a data
entry form performs edits or deletes on the record selected or provisions
the form for adding a new record when a button for that purpose is clicked.

This error below happens under a special circumstance that has something to
do with what I describe next.

I have two dropdowns on the data entry form. These dropdowns are linked by a
binding source relationship (and a relationship in the xsd). Because of this
relationship when a selection is made in the first dropdown it filters the
possible selections in the second dropdown.

The first dropdown selects the dimension (i.e. linear, area, volume) the
second selects the unit of measure (inch, foot, inch^2, foot^2...)

When the user makes a selection in the first dropdown (for example liner),
the second dropdown displays the first possible item without actually
selecting the dropdown (in this instance inch), an error will be thrown.
(Note the second dropdown does display the value.)

Why doesn't the form accept the displayed value in the second dropdown? Is
there a work around?

Below the error text and two sections of code; user code and partial class
for the form

==== the error text ====
System.Data.NoNullAllowedException was unhandled
Message="Column 'fkMeasureUnitID' does not allow nulls."
Source="System.Data"
StackTrace:
at System.Data.DataColumn.CheckNullable(DataRow row)
at System.Data.DataTable.RaiseRowChanging(DataRowChangeEventArgs
args, DataRow eRow, DataRowAction eAction, Boolean fireEvent)
at System.Data.DataTable.SetNewRecordWorker(DataRow row, Int32
proposedRecord, DataRowAction action, Boolean isInMerge, Int32 position,
Boolean fireEvent, Exception& deferredException)
at System.Data.DataTable.InsertRow(DataRow row, Int32 proposedID,
Int32 pos, Boolean fireEvent)
at System.Data.DataView.FinishAddNew(Int32 currentIndex, Boolean
success)
at System.Data.DataRowView.EndEdit()
at System.Windows.Forms.CurrencyManager.EndCurrentEdit()
at System.Windows.Forms.BindingSource.EndEdit()
at HIP2007.AddEditMasterTask.btnSave_Click(Object sender, EventArgs
e) in C:\HIP2007\HIP2007\CurrentWork\04_AddEditMasterTask.cs:line 145
at System.EventHandler.Invoke(Object sender, EventArgs e)
at System.Windows.Forms.Control.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons
button, Int32 clicks)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ButtonBase.WndProc(Message& m)
at System.Windows.Forms.Button.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message&
m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd,
Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG&
msg)
at
System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32
dwComponentID, Int32 reason, Int32 pvLoopData)
at
System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32
reason, ApplicationContext context)
at
System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason,
ApplicationContext context)
at System.Windows.Forms.Form.ShowDialog(IWin32Window owner)
at
HIP2007.CreateConfigureMasterTasks.btnAddViewEditTasks_Click(Object sender,
EventArgs e) in
C:\HIP2007\HIP2007\CurrentWork\03_CreateConfigureMasterTasks.cs:line 77
at System.Windows.Forms.Control.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons
button, Int32 clicks)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ButtonBase.WndProc(Message& m)
at System.Windows.Forms.Button.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message&
m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd,
Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG&
msg)
at
System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32
dwComponentID, Int32 reason, Int32 pvLoopData)
at
System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32
reason, ApplicationContext context)
at
System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason,
ApplicationContext context)
at HIP2007.Program.Main() in C:\HIP2007\HIP2007\Program.cs:line 19
at System.AppDomain.nExecuteAssembly(Assembly assembly, String[]
args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ExecutionContext.Run(ExecutionContext
executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()

=== end of the error text ===

=== use code ===
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace HIP2007
{
public partial class AddEditMasterTask : bsfAddEdit
{
// Avoid firing events during load
private bool _blnFormLoading = false;

// First record in Dgv or Edit
private bool _blnIsFirstRecordInDgv = false;

#region [ Constructors & InitializeMyForm

// Edit when existing rows
public AddEditMasterTask(int pkMTaskID)
{
InitializeMyForm();

// Title
lblDialogTitle.Text = "Add/Edit Master Task";

// Filter
bsMTask.Filter = "pkMTaskID = " + pkMTaskID;

// Populate form
taMTask.Fill(dataSetHipAdmin.MTask);
}

// First record when there is none to start with
public AddEditMasterTask()
{
InitializeMyForm();

// Title
lblDialogTitle.Text = "New Master Task";

// Populate form
taMTask.Fill(dataSetHipAdmin.MTask);

// Indicate that this is the first record
_blnIsFirstRecordInDgv = true;

}

private void InitializeMyForm()
{
_blnFormLoading = true;

InitializeComponent();

// form title
this.Text = "";

// Populate dropdowns
taPhase.Fill(dataSetHipAdmin.Phase);
taMeasureDim.Fill(dataSetHipAdmin.MeasureDim);
taMeasureUnit.Fill(dataSetHipAdmin.MeasureUnit);

// Disable Save button
this.btnSave.Enabled = false;

// Indicate that the form is no longer loading
// this controls behavior of events
_blnFormLoading = false;
}
#endregion

#region [ Enable button(s) after form load

public void EditsBegun(object sender, EventArgs e)
{
// Change buttons after edits begin
if (!_blnFormLoading)
this.btnSave.Enabled = true;
}

#endregion

#region [ Buttons

private void btnNew_Click(object sender, EventArgs e)
{
// Clear the current record
this.bsMTask.AddNew();

// Save state of the action performed
CreateConfigureMasterTasks.dgvRecordActionState =
CreateConfigureMasterTasks.dgvRcdAction.RecordAdded;
}

private void btnDelete_Click(object sender, EventArgs e)
{
// MessageBox attributes
string message = "Are you sure you want to permanaently remove
this record?";
string caption = "Confirmation window";
MessageBoxButtons buttons = MessageBoxButtons.YesNo;
DialogResult result;

// Displays MessageBox
result = MessageBox.Show(message, caption, buttons);

// Delete
if (result == System.Windows.Forms.DialogResult.Yes)
{
// Apply pending changes to the underlying data source
this.bsMTask.RemoveAt(0);

// Send changes back to the database
this.taMTask.Update(dataSetHipAdmin.MTask);

// Save state of the action performed
CreateConfigureMasterTasks.dgvRecordActionState =
CreateConfigureMasterTasks.dgvRcdAction.RecordDeleted;
}
else
{
// Save state of the action performed
CreateConfigureMasterTasks.dgvRecordActionState =
CreateConfigureMasterTasks.dgvRcdAction.RecordViewedOnly;
}

// Close
this.Close();
}

private void btnSave_Click(object sender, EventArgs e)
{
// Take care of loose ends and time stamp
if (contractorCommentsTextBox.Text == "")
{
this.contractorCommentsTextBox.Text = "No notes.";
}

// Populate dateTimePicker with now
this.modifiedDateDateTimePicker.Value = DateTime.Now;

// Apply pending changes to the underlying data source
bsMTask.EndEdit(); /////// < Here is the error 'fkMeasureUnitID'

// Send changes back to the database
taMTask.Update(dataSetHipAdmin.MTask);

// Was "New" the previous button click?
if (CreateConfigureMasterTasks.dgvRecordActionState ==
CreateConfigureMasterTasks.dgvRcdAction.RecordAdded)
{
// If RecordAdded then keep the setting RecordAdded
}
else
{
// Otherwise this is an Edit
CreateConfigureMasterTasks.dgvRecordActionState =
CreateConfigureMasterTasks.dgvRcdAction.RecordEdited;
}

// Close
this.Close();
}

private void btnCancel_Click(object sender, EventArgs e)
{
// Close without saving
bsMTask.CancelEdit();

// Save state of the action performed
CreateConfigureMasterTasks.dgvRecordActionState =
CreateConfigureMasterTasks.dgvRcdAction.RecordViewedOnly;

// Close
this.Close();
}

#endregion

}
}

=== end of user code ===

=== start of partial class ===

namespace HIP2007
{
partial class AddEditMasterTask
{
/// <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.components = new System.ComponentModel.Container();
System.Windows.Forms.Label pkMTaskIDLabel;
System.Windows.Forms.Label descriptionLabel;
System.Windows.Forms.Label baseTimeLabel;
System.Windows.Forms.Label allowParticipationLabel;
System.Windows.Forms.Label allowQuantityLabel;
System.Windows.Forms.Label ordLabel;
System.Windows.Forms.Label configuredDisplayLabel;
System.Windows.Forms.Label contractorCommentsLabel;
System.Windows.Forms.Label modifiedDateLabel;
System.Windows.Forms.Label fkMeasureDimIDLabel;
System.Windows.Forms.Label fkMeasureUnitIDLabel;
System.Windows.Forms.Label fkPhaseIDLabel1;
this.dataSetHipAdmin = new HIPAdminAccess.DataSetHipAdmin();
this.bsMTask = new
System.Windows.Forms.BindingSource(this.components);
this.pkMTaskIDTextBox = new System.Windows.Forms.TextBox();
this.descriptionTextBox = new System.Windows.Forms.TextBox();
this.baseTimeTextBox = new System.Windows.Forms.TextBox();
this.allowParticipationCheckBox = new
System.Windows.Forms.CheckBox();
this.allowQuantityCheckBox = new
System.Windows.Forms.CheckBox();
this.ordTextBox = new System.Windows.Forms.TextBox();
this.configuredDisplayCheckBox = new
System.Windows.Forms.CheckBox();
this.contractorCommentsTextBox = new
System.Windows.Forms.TextBox();
this.modifiedDateDateTimePicker = new
System.Windows.Forms.DateTimePicker();
this.taMTask = new
HIPAdminAccess.DataSetHipAdminTableAdapters.MTaskTableAdapter();
this.taMeasureUnit = new
HIPAdminAccess.DataSetHipAdminTableAdapters.MeasureUnitTableAdapter();
this.taMeasureDim = new
HIPAdminAccess.DataSetHipAdminTableAdapters.MeasureDimTableAdapter();
this.bsMeasureDim = new
System.Windows.Forms.BindingSource(this.components);
this.bsMeasureUnit = new
System.Windows.Forms.BindingSource(this.components);
this.fkMeasureDimIDComboBox = new
System.Windows.Forms.ComboBox();
this.fkMeasureUnitIDComboBox = new
System.Windows.Forms.ComboBox();
this.toolTip1 = new
System.Windows.Forms.ToolTip(this.components);
this.fkPhaseIDComboBox = new System.Windows.Forms.ComboBox();
this.bsPhase = new
System.Windows.Forms.BindingSource(this.components);
this.taPhase = new
HIPAdminAccess.DataSetHipAdminTableAdapters.PhaseTableAdapter();
pkMTaskIDLabel = new System.Windows.Forms.Label();
descriptionLabel = new System.Windows.Forms.Label();
baseTimeLabel = new System.Windows.Forms.Label();
allowParticipationLabel = new System.Windows.Forms.Label();
allowQuantityLabel = new System.Windows.Forms.Label();
ordLabel = new System.Windows.Forms.Label();
configuredDisplayLabel = new System.Windows.Forms.Label();
contractorCommentsLabel = new System.Windows.Forms.Label();
modifiedDateLabel = new System.Windows.Forms.Label();
fkMeasureDimIDLabel = new System.Windows.Forms.Label();
fkMeasureUnitIDLabel = new System.Windows.Forms.Label();
fkPhaseIDLabel1 = new System.Windows.Forms.Label();
((System.ComponentModel.ISupportInitialize)(this.dataSetHipAdmin)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.bsMTask)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.bsMeasureDim)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.bsMeasureUnit)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.bsPhase)).BeginInit();
this.SuspendLayout();
//
// lblDialogTitle
//
this.lblDialogTitle.TabIndex = 1;
//
// btnNew
//
this.btnNew.Location = new System.Drawing.Point(282, 421);
this.btnNew.TabIndex = 27;
this.btnNew.Click += new System.EventHandler(this.btnNew_Click);
//
// btnDelete
//
this.btnDelete.Location = new System.Drawing.Point(363, 421);
this.btnDelete.TabIndex = 28;
this.btnDelete.Click += new
System.EventHandler(this.btnDelete_Click);
//
// btnSave
//
this.btnSave.Location = new System.Drawing.Point(444, 421);
this.btnSave.TabIndex = 26;
this.btnSave.Click += new
System.EventHandler(this.btnSave_Click);
//
// btnCancel
//
this.btnCancel.Location = new System.Drawing.Point(525, 421);
this.btnCancel.TabIndex = 0;
this.btnCancel.Click += new
System.EventHandler(this.btnCancel_Click);
//
// pkMTaskIDLabel
//
pkMTaskIDLabel.AutoSize = true;
pkMTaskIDLabel.Location = new System.Drawing.Point(12, 45);
pkMTaskIDLabel.Name = "pkMTaskIDLabel";
pkMTaskIDLabel.Size = new System.Drawing.Size(72, 13);
pkMTaskIDLabel.TabIndex = 2;
pkMTaskIDLabel.Text = "pk MTask ID:";
pkMTaskIDLabel.Visible = false;
//
// descriptionLabel
//
descriptionLabel.AutoSize = true;
descriptionLabel.Location = new System.Drawing.Point(12, 97);
descriptionLabel.Name = "descriptionLabel";
descriptionLabel.Size = new System.Drawing.Size(63, 13);
descriptionLabel.TabIndex = 6;
descriptionLabel.Text = "Description:";
//
// baseTimeLabel
//
baseTimeLabel.AutoSize = true;
baseTimeLabel.Location = new System.Drawing.Point(12, 175);
baseTimeLabel.Name = "baseTimeLabel";
baseTimeLabel.Size = new System.Drawing.Size(60, 13);
baseTimeLabel.TabIndex = 12;
baseTimeLabel.Text = "Base Time:";
//
// allowParticipationLabel
//
allowParticipationLabel.AutoSize = true;
allowParticipationLabel.Location = new System.Drawing.Point(12,
203);
allowParticipationLabel.Name = "allowParticipationLabel";
allowParticipationLabel.Size = new System.Drawing.Size(96, 13);
allowParticipationLabel.TabIndex = 14;
allowParticipationLabel.Text = "Allow Participation:";
//
// allowQuantityLabel
//
allowQuantityLabel.AutoSize = true;
allowQuantityLabel.Location = new System.Drawing.Point(12, 233);
allowQuantityLabel.Name = "allowQuantityLabel";
allowQuantityLabel.Size = new System.Drawing.Size(77, 13);
allowQuantityLabel.TabIndex = 16;
allowQuantityLabel.Text = "Allow Quantity:";
//
// ordLabel
//
ordLabel.AutoSize = true;
ordLabel.Location = new System.Drawing.Point(13, 261);
ordLabel.Name = "ordLabel";
ordLabel.Size = new System.Drawing.Size(27, 13);
ordLabel.TabIndex = 18;
ordLabel.Text = "Ord:";
//
// configuredDisplayLabel
//
configuredDisplayLabel.AutoSize = true;
configuredDisplayLabel.Location = new System.Drawing.Point(12,
289);
configuredDisplayLabel.Name = "configuredDisplayLabel";
configuredDisplayLabel.Size = new System.Drawing.Size(98, 13);
configuredDisplayLabel.TabIndex = 20;
configuredDisplayLabel.Text = "Configured Display:";
//
// contractorCommentsLabel
//
contractorCommentsLabel.AutoSize = true;
contractorCommentsLabel.Location = new System.Drawing.Point(12,
317);
contractorCommentsLabel.Name = "contractorCommentsLabel";
contractorCommentsLabel.Size = new System.Drawing.Size(111, 13);
contractorCommentsLabel.TabIndex = 22;
contractorCommentsLabel.Text = "Contractor Comments:";
//
// modifiedDateLabel
//
modifiedDateLabel.AutoSize = true;
modifiedDateLabel.Location = new System.Drawing.Point(12, 370);
modifiedDateLabel.Name = "modifiedDateLabel";
modifiedDateLabel.Size = new System.Drawing.Size(76, 13);
modifiedDateLabel.TabIndex = 24;
modifiedDateLabel.Text = "Modified Date:";
//
// fkMeasureDimIDLabel
//
fkMeasureDimIDLabel.AutoSize = true;
fkMeasureDimIDLabel.Location = new System.Drawing.Point(12,
123);
fkMeasureDimIDLabel.Name = "fkMeasureDimIDLabel";
fkMeasureDimIDLabel.Size = new System.Drawing.Size(59, 13);
fkMeasureDimIDLabel.TabIndex = 8;
fkMeasureDimIDLabel.Text = "Dimension:";
//
// fkMeasureUnitIDLabel
//
fkMeasureUnitIDLabel.AutoSize = true;
fkMeasureUnitIDLabel.Location = new System.Drawing.Point(11,
149);
fkMeasureUnitIDLabel.Name = "fkMeasureUnitIDLabel";
fkMeasureUnitIDLabel.Size = new System.Drawing.Size(29, 13);
fkMeasureUnitIDLabel.TabIndex = 10;
fkMeasureUnitIDLabel.Text = "Unit:";
//
// fkPhaseIDLabel1
//
fkPhaseIDLabel1.AutoSize = true;
fkPhaseIDLabel1.Location = new System.Drawing.Point(12, 71);
fkPhaseIDLabel1.Name = "fkPhaseIDLabel1";
fkPhaseIDLabel1.Size = new System.Drawing.Size(40, 13);
fkPhaseIDLabel1.TabIndex = 4;
fkPhaseIDLabel1.Text = "Phase:";
//
// dataSetHipAdmin
//
this.dataSetHipAdmin.DataSetName = "DataSetHipAdmin";
this.dataSetHipAdmin.SchemaSerializationMode =
System.Data.SchemaSerializationMode.IncludeSchema;
//
// bsMTask
//
this.bsMTask.DataMember = "MTask";
this.bsMTask.DataSource = this.dataSetHipAdmin;
//
// pkMTaskIDTextBox
//
this.pkMTaskIDTextBox.DataBindings.Add(new
System.Windows.Forms.Binding("Text", this.bsMTask, "pkMTaskID", true));
this.pkMTaskIDTextBox.Location = new System.Drawing.Point(129,
42);
this.pkMTaskIDTextBox.Name = "pkMTaskIDTextBox";
this.pkMTaskIDTextBox.Size = new System.Drawing.Size(200, 20);
this.pkMTaskIDTextBox.TabIndex = 3;
this.pkMTaskIDTextBox.Visible = false;
//
// descriptionTextBox
//
this.descriptionTextBox.DataBindings.Add(new
System.Windows.Forms.Binding("Text", this.bsMTask, "Description", true));
this.descriptionTextBox.Location = new System.Drawing.Point(129,
95);
this.descriptionTextBox.Name = "descriptionTextBox";
this.descriptionTextBox.Size = new System.Drawing.Size(400, 20);
this.descriptionTextBox.TabIndex = 7;
this.descriptionTextBox.TextChanged += new
System.EventHandler(this.EditsBegun);
//
// baseTimeTextBox
//
this.baseTimeTextBox.DataBindings.Add(new
System.Windows.Forms.Binding("Text", this.bsMTask, "BaseTime", true));
this.baseTimeTextBox.Location = new System.Drawing.Point(129,
172);
this.baseTimeTextBox.Name = "baseTimeTextBox";
this.baseTimeTextBox.Size = new System.Drawing.Size(50, 20);
this.baseTimeTextBox.TabIndex = 13;
this.toolTip1.SetToolTip(this.baseTimeTextBox, "The time for
each unit of dimensional unit.");
this.baseTimeTextBox.TextChanged += new
System.EventHandler(this.EditsBegun);
//
// allowParticipationCheckBox
//
this.allowParticipationCheckBox.DataBindings.Add(new
System.Windows.Forms.Binding("CheckState", this.bsMTask,
"AllowParticipation", true));
this.allowParticipationCheckBox.Location = new
System.Drawing.Point(129, 198);
this.allowParticipationCheckBox.Name =
"allowParticipationCheckBox";
this.allowParticipationCheckBox.Size = new
System.Drawing.Size(50, 24);
this.allowParticipationCheckBox.TabIndex = 15;
this.allowParticipationCheckBox.CheckedChanged += new
System.EventHandler(this.EditsBegun);
//
// allowQuantityCheckBox
//
this.allowQuantityCheckBox.DataBindings.Add(new
System.Windows.Forms.Binding("CheckState", this.bsMTask, "AllowQuantity",
true));
this.allowQuantityCheckBox.Location = new
System.Drawing.Point(129, 228);
this.allowQuantityCheckBox.Name = "allowQuantityCheckBox";
this.allowQuantityCheckBox.Size = new System.Drawing.Size(50,
24);
this.allowQuantityCheckBox.TabIndex = 17;
this.allowQuantityCheckBox.CheckedChanged += new
System.EventHandler(this.EditsBegun);
//
// ordTextBox
//
this.ordTextBox.DataBindings.Add(new
System.Windows.Forms.Binding("Text", this.bsMTask, "Ord", true));
this.ordTextBox.Location = new System.Drawing.Point(129, 258);
this.ordTextBox.Name = "ordTextBox";
this.ordTextBox.Size = new System.Drawing.Size(50, 20);
this.ordTextBox.TabIndex = 19;
this.toolTip1.SetToolTip(this.ordTextBox, "The order in which
this task appears within the same phase.");
this.ordTextBox.TextChanged += new
System.EventHandler(this.EditsBegun);
//
// configuredDisplayCheckBox
//
this.configuredDisplayCheckBox.DataBindings.Add(new
System.Windows.Forms.Binding("CheckState", this.bsMTask,
"ConfiguredDisplay", true));
this.configuredDisplayCheckBox.Location = new
System.Drawing.Point(129, 284);
this.configuredDisplayCheckBox.Name =
"configuredDisplayCheckBox";
this.configuredDisplayCheckBox.Size = new
System.Drawing.Size(50, 24);
this.configuredDisplayCheckBox.TabIndex = 21;
this.configuredDisplayCheckBox.CheckedChanged += new
System.EventHandler(this.EditsBegun);
//
// contractorCommentsTextBox
//
this.contractorCommentsTextBox.DataBindings.Add(new
System.Windows.Forms.Binding("Text", this.bsMTask, "ContractorComments",
true));
this.contractorCommentsTextBox.Location = new
System.Drawing.Point(129, 314);
this.contractorCommentsTextBox.Multiline = true;
this.contractorCommentsTextBox.Name =
"contractorCommentsTextBox";
this.contractorCommentsTextBox.Size = new
System.Drawing.Size(400, 46);
this.contractorCommentsTextBox.TabIndex = 23;
this.contractorCommentsTextBox.TextChanged += new
System.EventHandler(this.EditsBegun);
//
// modifiedDateDateTimePicker
//
this.modifiedDateDateTimePicker.DataBindings.Add(new
System.Windows.Forms.Binding("Value", this.bsMTask, "ModifiedDate", true));
this.modifiedDateDateTimePicker.Enabled = false;
this.modifiedDateDateTimePicker.Location = new
System.Drawing.Point(129, 366);
this.modifiedDateDateTimePicker.Name =
"modifiedDateDateTimePicker";
this.modifiedDateDateTimePicker.Size = new
System.Drawing.Size(200, 20);
this.modifiedDateDateTimePicker.TabIndex = 25;
//
// taMTask
//
this.taMTask.ClearBeforeFill = true;
//
// taMeasureUnit
//
this.taMeasureUnit.ClearBeforeFill = true;
//
// taMeasureDim
//
this.taMeasureDim.ClearBeforeFill = true;
//
// bsMeasureDim
//
this.bsMeasureDim.DataMember = "MeasureDim";
this.bsMeasureDim.DataSource = this.dataSetHipAdmin;
this.bsMeasureDim.Sort = "ord";
//
// bsMeasureUnit
//
this.bsMeasureUnit.DataMember = "FK_MeasureUnit_MeasureDim";
this.bsMeasureUnit.DataSource = this.bsMeasureDim;
this.bsMeasureUnit.Sort = "ord";
//
// fkMeasureDimIDComboBox
//
this.fkMeasureDimIDComboBox.DataBindings.Add(new
System.Windows.Forms.Binding("SelectedValue", this.bsMTask,
"fkMeasureDimID", true));
this.fkMeasureDimIDComboBox.DataSource = this.bsMeasureDim;
this.fkMeasureDimIDComboBox.DisplayMember = "Dimension";
this.fkMeasureDimIDComboBox.DropDownStyle =
System.Windows.Forms.ComboBoxStyle.DropDownList;
this.fkMeasureDimIDComboBox.FormattingEnabled = true;
this.fkMeasureDimIDComboBox.Location = new
System.Drawing.Point(129, 120);
this.fkMeasureDimIDComboBox.Name = "fkMeasureDimIDComboBox";
this.fkMeasureDimIDComboBox.Size = new System.Drawing.Size(200,
21);
this.fkMeasureDimIDComboBox.TabIndex = 9;
this.fkMeasureDimIDComboBox.ValueMember = "pkMeasureDimID";
this.fkMeasureDimIDComboBox.SelectedValueChanged += new
System.EventHandler(this.EditsBegun);
//
// fkMeasureUnitIDComboBox
//
this.fkMeasureUnitIDComboBox.DataBindings.Add(new
System.Windows.Forms.Binding("SelectedValue", this.bsMTask,
"fkMeasureUnitID", true));
this.fkMeasureUnitIDComboBox.DataSource = this.bsMeasureUnit;
this.fkMeasureUnitIDComboBox.DisplayMember = "Unit";
this.fkMeasureUnitIDComboBox.DropDownStyle =
System.Windows.Forms.ComboBoxStyle.DropDownList;
this.fkMeasureUnitIDComboBox.FormattingEnabled = true;
this.fkMeasureUnitIDComboBox.Location = new
System.Drawing.Point(129, 146);
this.fkMeasureUnitIDComboBox.Name = "fkMeasureUnitIDComboBox";
this.fkMeasureUnitIDComboBox.Size = new System.Drawing.Size(200,
21);
this.fkMeasureUnitIDComboBox.TabIndex = 11;
this.fkMeasureUnitIDComboBox.ValueMember = "pkMeasureUnitID";
this.fkMeasureUnitIDComboBox.SelectedValueChanged += new
System.EventHandler(this.EditsBegun);
//
// fkPhaseIDComboBox
//
this.fkPhaseIDComboBox.DataBindings.Add(new
System.Windows.Forms.Binding("SelectedValue", this.bsMTask, "fkPhaseID",
true));
this.fkPhaseIDComboBox.DataSource = this.bsPhase;
this.fkPhaseIDComboBox.DisplayMember = "Phase";
this.fkPhaseIDComboBox.DropDownStyle =
System.Windows.Forms.ComboBoxStyle.DropDownList;
this.fkPhaseIDComboBox.FormattingEnabled = true;
this.fkPhaseIDComboBox.Location = new System.Drawing.Point(129,
68);
this.fkPhaseIDComboBox.Name = "fkPhaseIDComboBox";
this.fkPhaseIDComboBox.Size = new System.Drawing.Size(200, 21);
this.fkPhaseIDComboBox.TabIndex = 5;
this.fkPhaseIDComboBox.ValueMember = "pkPhaseID";
this.fkPhaseIDComboBox.SelectedValueChanged += new
System.EventHandler(this.EditsBegun);
//
// bsPhase
//
this.bsPhase.DataMember = "Phase";
this.bsPhase.DataSource = this.dataSetHipAdmin;
this.bsPhase.Sort = "ord";
//
// taPhase
//
this.taPhase.ClearBeforeFill = true;
//
// AddEditMasterTask
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(612, 456);
this.Controls.Add(fkPhaseIDLabel1);
this.Controls.Add(this.fkPhaseIDComboBox);
this.Controls.Add(fkMeasureUnitIDLabel);
this.Controls.Add(this.fkMeasureUnitIDComboBox);
this.Controls.Add(fkMeasureDimIDLabel);
this.Controls.Add(this.fkMeasureDimIDComboBox);
this.Controls.Add(pkMTaskIDLabel);
this.Controls.Add(this.pkMTaskIDTextBox);
this.Controls.Add(descriptionLabel);
this.Controls.Add(this.descriptionTextBox);
this.Controls.Add(baseTimeLabel);
this.Controls.Add(this.baseTimeTextBox);
this.Controls.Add(allowParticipationLabel);
this.Controls.Add(this.allowParticipationCheckBox);
this.Controls.Add(allowQuantityLabel);
this.Controls.Add(this.allowQuantityCheckBox);
this.Controls.Add(ordLabel);
this.Controls.Add(this.ordTextBox);
this.Controls.Add(configuredDisplayLabel);
this.Controls.Add(this.configuredDisplayCheckBox);
this.Controls.Add(contractorCommentsLabel);
this.Controls.Add(this.contractorCommentsTextBox);
this.Controls.Add(modifiedDateLabel);
this.Controls.Add(this.modifiedDateDateTimePicker);
this.Name = "AddEditMasterTask";
this.Text = "AddEditMTask";
this.Controls.SetChildIndex(this.btnNew, 0);
this.Controls.SetChildIndex(this.btnDelete, 0);
this.Controls.SetChildIndex(this.btnSave, 0);
this.Controls.SetChildIndex(this.btnCancel, 0);
this.Controls.SetChildIndex(this.lblDialogTitle, 0);
this.Controls.SetChildIndex(this.modifiedDateDateTimePicker, 0);
this.Controls.SetChildIndex(modifiedDateLabel, 0);
this.Controls.SetChildIndex(this.contractorCommentsTextBox, 0);
this.Controls.SetChildIndex(contractorCommentsLabel, 0);
this.Controls.SetChildIndex(this.configuredDisplayCheckBox, 0);
this.Controls.SetChildIndex(configuredDisplayLabel, 0);
this.Controls.SetChildIndex(this.ordTextBox, 0);
this.Controls.SetChildIndex(ordLabel, 0);
this.Controls.SetChildIndex(this.allowQuantityCheckBox, 0);
this.Controls.SetChildIndex(allowQuantityLabel, 0);
this.Controls.SetChildIndex(this.allowParticipationCheckBox, 0);
this.Controls.SetChildIndex(allowParticipationLabel, 0);
this.Controls.SetChildIndex(this.baseTimeTextBox, 0);
this.Controls.SetChildIndex(baseTimeLabel, 0);
this.Controls.SetChildIndex(this.descriptionTextBox, 0);
this.Controls.SetChildIndex(descriptionLabel, 0);
this.Controls.SetChildIndex(this.pkMTaskIDTextBox, 0);
this.Controls.SetChildIndex(pkMTaskIDLabel, 0);
this.Controls.SetChildIndex(this.fkMeasureDimIDComboBox, 0);
this.Controls.SetChildIndex(fkMeasureDimIDLabel, 0);
this.Controls.SetChildIndex(this.fkMeasureUnitIDComboBox, 0);
this.Controls.SetChildIndex(fkMeasureUnitIDLabel, 0);
this.Controls.SetChildIndex(this.fkPhaseIDComboBox, 0);
this.Controls.SetChildIndex(fkPhaseIDLabel1, 0);
((System.ComponentModel.ISupportInitialize)(this.dataSetHipAdmin)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.bsMTask)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.bsMeasureDim)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.bsMeasureUnit)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.bsPhase)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();

}

#endregion

private HIPAdminAccess.DataSetHipAdmin dataSetHipAdmin;
private System.Windows.Forms.BindingSource bsMTask;
private System.Windows.Forms.TextBox pkMTaskIDTextBox;
private System.Windows.Forms.TextBox descriptionTextBox;
private System.Windows.Forms.TextBox baseTimeTextBox;
private System.Windows.Forms.CheckBox allowParticipationCheckBox;
private System.Windows.Forms.CheckBox allowQuantityCheckBox;
private System.Windows.Forms.TextBox ordTextBox;
private System.Windows.Forms.CheckBox configuredDisplayCheckBox;
private System.Windows.Forms.TextBox contractorCommentsTextBox;
private System.Windows.Forms.DateTimePicker
modifiedDateDateTimePicker;
private
HIPAdminAccess.DataSetHipAdminTableAdapters.MTaskTableAdapter taMTask;
private System.Windows.Forms.BindingSource bsMeasureDim;
private System.Windows.Forms.BindingSource bsMeasureUnit;
private
HIPAdminAccess.DataSetHipAdminTableAdapters.MeasureUnitTableAdapter
taMeasureUnit;
private
HIPAdminAccess.DataSetHipAdminTableAdapters.MeasureDimTableAdapter
taMeasureDim;
private System.Windows.Forms.ComboBox fkMeasureDimIDComboBox;
private System.Windows.Forms.ComboBox fkMeasureUnitIDComboBox;
private System.Windows.Forms.ToolTip toolTip1;
private System.Windows.Forms.ComboBox fkPhaseIDComboBox;
private System.Windows.Forms.BindingSource bsPhase;
private
HIPAdminAccess.DataSetHipAdminTableAdapters.PhaseTableAdapter taPhase;
}
}
=== end of partial class ===

Thank you
 
Hi,

I notice that the AddEditMasterTask class inherits from the bsfAddEdit
class in your sample code. However, the definition of the bsfAddEdit class
isn't provided in your first message.

Could you please create a simple application that could just reproduce the
problem and send it to me?

To get my actual email address, remove 'online' from my displayed email
adress.

Thank you for your understanding and cooperation!

Sincerely,
Linda Liu
Microsoft Online Community Support

==================================================
Get notification to my posts through email? Please refer to
http://msdn.microsoft.com/subscriptions/managednewsgroups/default.aspx#notif
ications.

Note: The MSDN Managed Newsgroup support offering is for non-urgent issues
where an initial response from the community or a Microsoft Support
Engineer within 1 business day is acceptable. Please note that each follow
up response may take approximately 2 business days as the support
professional working with you may need further investigation to reach the
most efficient resolution. The offering is not appropriate for situations
that require urgent, real-time or phone-based interactions or complex
project analysis and dump analysis issues. Issues of this nature are best
handled working with a dedicated Microsoft Support Engineer by contacting
Microsoft Customer Support Services (CSS) at
http://msdn.microsoft.com/subscriptions/support/default.aspx.
==================================================

This posting is provided "AS IS" with no warranties, and confers no rights.
 
Hi Douglas,

I have sent you a sample project to your email box.

If there's any question, please feel free to let me know.

Sincerely,
Linda Liu
Microsoft Online Community Support
 
Linda,

Thank you for sending me the sample.

===========================
Your application contains the same bug:

By-the-way your sample behaves in identical fashion as my application with
only one snall difference - since your sample allows nulls no error is
thrown.

=======================
A walk-thorugh to repeat the bug:

I can walk you through two scenarios that will both repeat the behavior.
Scenario 'A' uses the keyboard only to repeat the problem and scenario 'B'
makes use of the mouse to repeat the behavior.

--------------------------
Scenario 'A' keyboard only
--------------------------
Start the project - Form1 opens

Click 'add' button - Form2 opens

Enter 1 for the ID

Tab to go to the Measure dropdown box

On your keyboard click the down arrow to select "area"

Notice that the Unit control now displays "inch^2"

click 'save' button

Note the new record displays no value for the Unit column

(You may continue to Scenario 'B' without closing)
--------------------------
Scenario 'B' with mouse
--------------------------
Click 'add' button - Form2 opens

Enter 2 for the ID

Click on the dropdown arrow for the Measure control and select "linear"

Notice unit now displays "inch"

click 'save' button

Note the new record displays no value for the Unit column

================
Essential considerations:

This situation only occurs if the desired Unit value happens to be the one
displayed immediately after the Measuer column is selectd. And to prevent
the problem the user has only to deliberately re-select the Unit value that
is already shown.

=======
Questions:

1.) Why does the populated control in the data entry form not result in data
being entered into the dataset and thus the record in the data grid view?

2.) What is the work-around to make the binding to behave as designed?

Douglas
 
Hi Douglas,

Thank you for your reply and the detailed description!

I understand your problem now.
1.) Why does the populated control in the data entry form not result in
data being entered into the dataset and thus the record in the data grid
view?

When we select the "area" item in the ComboBox1 in the Form2, "inch^2" is
selected and displayed in the ComboBox2. However, the SelectedValueChanged
event of the ComboBox2 is not fired at this time, so the new value is not
pushed back to the data source by data binding.
2.) What is the work-around to make the binding to behave as designed?

The workaround is simple, i.e. call the WriteValue method of the
corresponding Binding object to force the new value to be pushed back to
the data source. The following is a sample:

public partial class Form2 : Form
{
...
private void button1_Click(object sender, EventArgs e)
{
// add this line of code to force the new value to be pushed
back to the data source
this.comboBox2.DataBindings["SelectedValue"].WriteValue();
this.BindingContext[ds, "DataTable1"].EndCurrentEdit();
this.Close();
}
}

Hope this helps.
If you have anything unclear, please feel free to let me know.

Sincerely,
Linda Liu
Microsoft Online Community Support
 
Linda,

Thank you so much for your reply and great explaination!

There seems to be so many little things that one cannot discover while
working with Visual Studio. I am luck to have a lot of books available to
me, but books do not seem to cover the sorts of things I run into.

I do great on C# of VB tests, but when it comes to using the product in the
real world... I go so far and get stuck. Go a little more and get stuck. I
wish using the product were just a little bit more intuative or
discoverable.

Are there any books or other learning resources you could suggest to help
me, as they call it, "get it"?

Thanks,
Doug
 
Hi Doug,

Thank you for your feedback!

You may refer to the following MSDN document for more information on data
binding:

'Windows Forms Data Binding'
http://msdn2.microsoft.com/en-us/library/ef2xyb33(VS.80).aspx

If you have any question in the future, please feel free to post in the
newsgroup. We will be glad to work with you to get the problems solved : )

Sincerely,
Linda Liu
Microsoft Online Community Support
 
Linda,

I have tried to implement your suggestion but without success. I believe it
has to do with the different ways that we bind. Where you use EndCurrentEdit
with BindingContext I use EndEdit with BindingSource.

Here is your code (for the benefit of others):
public partial class Form2 : Form
{
...
private void button1_Click(object sender, EventArgs e)
{
// add this line of code to force the new value to be pushed
back to the data source
this.comboBox2.DataBindings["SelectedValue"].WriteValue();
this.BindingContext[ds, "DataTable1"].EndCurrentEdit();
this.Close();
}
}

Here is my attempt to implement it with my approach (pertinent statements
only):

private void btnSave_Click(object sender, EventArgs e)
{
// Force the displayed the child combobox value to be pushed
back to the data source
this.fkMeasureDimIDComboBox.DataBindings["SelectedValue"].WriteValue();

// for reference - if my situation were similar to Linda's...
// this.BindingContext[dataSetHipAdmin,
"MTask"].EndCurrentEdit();

// Apply pending changes to the underlying data source
bsMTask.EndEdit();

// Send changes back to the database
taMTask.Update(dataSetHipAdmin.MTask);

this.Close();
}

==========================
More on my approach:

I do not refer to or use BindingContext or CurrencyManager in my project.
Rather I approach it this way...

Here are a few statements to show how I use the BindingSource ("bsMTask")
and TableAdapter ("taMTask") for table ("MTask") in the child form - the
form of interest.

In the constructor I populate the controls on the form this way (when the
form is opened to editing an existing record):

// Filter from passed in parameter
bsMTask.Filter = "pkMTaskID = " + pkMTaskID;

// Populate form
taMTask.Fill(dataSetHipAdmin.MTask);

When I create a new row I do this:

// Clear the current record
this.bsMTask.AddNew();

When I delelete the current record I do this:

// Apply pending changes to the underlying data source
this.bsMTask.RemoveAt(0);

// Send changes back to the database
this.taMTask.Update(dataSetHipAdmin.MTask);

When I save an edited record (or new one) I do this:

// Apply pending changes to the underlying data source
bsMTask.EndEdit();

// Send changes back to the database
taMTask.Update(dataSetHipAdmin.MTask);

==========================
....and in the parent form - where my dataGridView is, and from where I call
the child form, I approach it this way...

To populate the dataGridView I do this:

// Load data grid view
taVwMTask_PhaseDimUnit2.Fill(dataSetHipAdmin2.vwMTask_PhaseDimUnit2);

To open the child from (the editing dialog) I do this (simplified):
(Note there are overridden calls to the child form depending on the presence
of a record in the dataGridVView)

private void btnAddViewEditTasks_Click(object sender, EventArgs e)
{
if (bsVwMTask_PhaseDimUnit2.Count >= 1)
{
// Open for editing a selected record
AddEditMasterTask f = new
AddEditMasterTask(pkMTaskIdDgvMTasksCurrentRow());

// Open dialog
f.ShowDialog();

// Populate the TableAdapter's data table with the results of
the TableAdapter's SELECT command
taVwMTask_PhaseDimUnit2.Fill(dataSetHipAdmin2.vwMTask_PhaseDimUnit2);
}
else
{
// open for adding a new record when none are present
AddEditMasterTask f = new AddEditMasterTask();

// Open dialog
f.ShowDialog();

// Populate the TableAdapter's data table with the results of
the TableAdapter's SELECT command
taVwMTask_PhaseDimUnit2.Fill(dataSetHipAdmin2.vwMTask_PhaseDimUnit2);
}
}

===========================
For your reference here are portions of my designer generated code for the
child form (selected statements to show some references to bsMTask )

private void InitializeComponent()
{
...
this.bsMTask = new
System.Windows.Forms.BindingSource(this.components);
...
((System.ComponentModel.ISupportInitialize)(this.bsMTask)).BeginInit();
...

//
// bsMTask
//
this.bsMTask.DataMember = "MTask";
this.bsMTask.DataSource = this.dataSetHipAdmin;
//
// pkMTaskIDTextBox
//
this.pkMTaskIDTextBox.DataBindings.Add(new
System.Windows.Forms.Binding("Text", this.bsMTask, "pkMTaskID", true));
this.pkMTaskIDTextBox.Location = new System.Drawing.Point(129,
42);
this.pkMTaskIDTextBox.Name = "pkMTaskIDTextBox";
this.pkMTaskIDTextBox.Size = new System.Drawing.Size(200, 20);
this.pkMTaskIDTextBox.TabIndex = 3;
this.pkMTaskIDTextBox.Visible = false;
...

((System.ComponentModel.ISupportInitialize)(this.bsMTask)).EndInit();
...

private System.Windows.Forms.BindingSource bsMTask;
===========================

So with my approach using

// Force the displayed the child combobox value to be pushed
back to the data source
this.fkMeasureDimIDComboBox.DataBindings["SelectedValue"].WriteValue();

// Apply pending changes to the underlying data source
bsMTask.EndEdit();

I still get the "System.Data.NoNullAllowedException was unhandled" error. on
the statement "bsMTask.EndEdit();" What am I doing wrong? How can I correct
it within my situation?

Thank you,
Douglas
 
Hi Douglas,

In the Form2 within my sample project, I create a BindingSource instance to
bind to the dataset and datatable, and then bind the TextBox and two
ComboBoxes to the BindingSource instance instead of the dataset. In the
Button1's Click event handler, I call the BindingSource.EndEdit method to
apply the pending changes to the underlying data source and all works well.
The following is the modified code in the Form2:

public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}

private DataSet ds;
public DataSet DS
{
get { return ds; }
set { ds = value; }
}
// create a BindingSource instance
private BindingSource bs;

private void Form2_Load(object sender, EventArgs e)
{
BindingSource bsParent = new BindingSource(ds,"Measure");
BindingSource bsChild =new
BindingSource(bsParent,"Measure_Unit");
this.comboBox1.DataSource = bsParent;
this.comboBox1.DisplayMember ="Name";
this.comboBox1.ValueMember = "ID";

this.comboBox2.DataSource = bsChild;
this.comboBox2.DisplayMember = "Name";
this.comboBox2.ValueMember = "ID";

// bind the BindingSource instance to the dataset
bs = new BindingSource(ds, "DataTable1");

// bind the controls to the BindingSource instead of the dataset
this.textBox1.DataBindings.Add("Text", bs, "ID");
this.comboBox1.DataBindings.Add("SelectedValue", bs,
"MeasureID");
this.comboBox2.DataBindings.Add("SelectedValue", bs, "UnitID");

// call the BindingSource.AddNew method to add a new row
bs.AddNew();
}

private void button1_Click(object sender, EventArgs e)
{
this.comboBox2.DataBindings["SelectedValue"].WriteValue();

// call the BindingSource.EndEdit method to apply the pending
changes to the underlying data source
bs.EndEdit();
this.Close();
}
}

Since I couldn't reproduce the problem in my sample project, I strongly
recommend you to send me a sample project that could just reproduce the
problem or modify my sample project to reproduce the problem.

Thank you for your understanding and I look forward to your reply!

Sincerely,
Linda Liu
Microsoft Online Community Support
 
Linda,

I got it to work. It was a silly mistake. I referenced the wrong control
with my WriteValue().

Thank you for your help,

Douglas
 
Back
Top