DOBON.NET DOBON.NETプログラミング掲示板過去ログ

BindingSource と 独自クラスで入力チェックをしたい

環境/言語:[C# .NET Framework4]
分類:[.NET]

MSDNの「Binding.BindingComplete イベント」のサンプルコードを実行するとエラーでプログラムが止まります。

TextBox3 の数字の入力範囲のチェックをしたと思っています。

「Part」クラスを作って 100以下の数字を入力した場合の入力チェックをして「BindingComplete」イベントで入力チェックの結果を処理したいと思っています。

「デバッグなしで開始」の実行は、うまくいくのですが、「デバッグ開始」の実行は、画像のようなエラーになります。

どのようにすればよいのでしょうか?

サンプルコードの一部を変更しています。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication9 {
public partial class Form1 : Form {

private BindingSource BindingSource1 = new BindingSource();
Binding partNameBinding;
Binding partNumberBinding;

public Form1() {
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e) {
// Set the DataSource of BindingSource1 to the Part type.
try {
BindingSource1.DataSource = typeof(Part);

// Bind the textboxes to the properties of the Part type,
// enabling formatting.
partNameBinding = textBox1.DataBindings.Add("Text",
BindingSource1, "PartName", true);

partNumberBinding = textBox2.DataBindings.Add("Text", BindingSource1, "PartNumber",
true);

//Bind the textbox to the PartPrice value with currency formatting.
textBox3.DataBindings.Add("Text", BindingSource1, "PartPrice", true,
DataSourceUpdateMode.OnPropertyChanged, 0, "C");


// Handle the BindingComplete event for BindingSource1 and
// the partNameBinding.
partNumberBinding.BindingComplete +=
new BindingCompleteEventHandler(partNumberBinding_BindingComplete);
partNameBinding.BindingComplete +=
new BindingCompleteEventHandler(partNameBinding_BindingComplete);

// Add a new part to BindingSource1.
BindingSource1.Add(new Part("Widget", 1234, 12.45));
} catch (Exception) {

}
}


void partNumberBinding_BindingComplete(object sender,
BindingCompleteEventArgs e) {
if (e.BindingCompleteState != BindingCompleteState.Success)
Console.WriteLine("partNumberBinding: " + e.ErrorText);
}

// Handle the BindingComplete event to catch errors and
// exceptions in binding process.
void partNameBinding_BindingComplete(object sender,
BindingCompleteEventArgs e) {
if (e.BindingCompleteState != BindingCompleteState.Success)
Console.WriteLine("partNameBinding: " + e.ErrorText);
}
}

// Represents a business object that throws exceptions when invalid values are
// entered for some of its properties.
public class Part {
private string name;
private int number;
private double price;

public Part(string name, int number, double price) {
PartName = name;
PartNumber = number;
PartPrice = price;
}

public string PartName {
get { return name; }
set {
name = value;
}
}
public double PartPrice {
get { return price; }
set { price = value; }
}

public int PartNumber {
get { return number; }
set {
if (value < 100)
throw new Exception("Invalid part number." +
" Part numbers must be greater than 100.");
else
number = value;
}
}
}


}
添付ファイル: 1366520468.png (66 KB)
.NET 4 で試している限り、Visual Studio のデバッグ設定に依存するようですね。
ツール - オプションからダイアログを開き、デバッグ - 全般にある「'マイコードのみ' 設定を有効にする」項目を OFF にすると挙動が変わります。

ここからは推測になってしまいますが、デバッグ時にハンドルされていない例外を検知するための仕組みの都合で、外側で catch されているとしても「ハンドルされていない」と検知してしまうのだと思います。その状態で F5 キーで続けると何事もなく動きます。

// .NET 3.5 だとマイコードのみでもきちんと動くようですね。
Azuleanさんのとおりに

> ツール - オプションからダイアログを開き、デバッグ - 全般にある「'マイコードのみ' 設定を有効にする」項目を OFF にすると挙動が変わります。

設定するとできました。

ありがとうございます。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板