1

このコードで「データソースのプロパティまたは列にバインドできません」というメッセージが表示されます(「 <-- here!」コメントが追加された行に):

List<QHQuad> listQH = PlatypusData.GetQHForPlatypusAndDay(platypusId, dow);
foreach (var quad in listQH)
{
    int QHCell = quad.QH;
    if ((QHCell >= 1) || (QHCell <= QUARTER_HOUR_COUNT))
    {
        string PH1CellToPopulate = string.Format("textBoxA_{0}", QHCell);
        string PH2CellToPopulate = string.Format("textBoxB_{0}", QHCell);
        string PH3CellToPopulate = string.Format("textBoxC_{0}", QHCell);
        var tb = (TextBox)this.Controls.Find(PH1CellToPopulate, true).First();
        tb.DataBindings.Add(new Binding("Text", quad, "Ph1")); // <-- here!
        tb = (TextBox)this.Controls.Find(PH2CellToPopulate, true).First();
        tb.DataBindings.Add(new Binding("Text", quad, "Ph2"));
        tb = (TextBox)this.Controls.Find(PH3CellToPopulate, true).First();
        tb.DataBindings.Add(new Binding("Text", quad, "Ph3")); 
    }
}

障害が発生した時点で、quad には次の 4 つの値が含まれます。QHCell は 1 です。空白文字列である Ph1。Ph2 は空白文字列です。Ph3は「1」

アップデート

quad.QH にアクセスできるので、可視性が問題になるとは思いません。また、クラスは public です。

私が得ているより完全な例外は、「System.ArgumentException was unhandled by user code Message=Cannot bind to the property or column Ph1 on the DataSource. Parameter name: dataMember」です。

問題の行を変更すると:

tb.DataBindings.Add(new Binding("Text", quad, "Ph1"));

...これに:

tb.DataBindings.Add(new Binding("Text", listQH, "quad.Ph1"));

フィールドクワッドの子リストを作成できません」というメッセージが表示されます

更新 2

私がやっている方法では、データをバインドする意味がないからだと思います:

もともと、私は 384 人のメンバーを持つクラスを持っていました。

int
string
string
string

次に、4 つのメンバーを持つクラスの 96 個のインスタンスを使用するように変更しました (上の例では、「クワッド」、つまり QH、Ph1、Ph2、および Ph3)。

したがって、これらの一時的なクラス インスタンスにバインドしようとすることは、私の側ではあまり賢明ではありませんでした。そのクラスの 96 個のインスタンスを維持する必要がありました。

私はまだ間違っている可能性がありますが、これがここでデータバインドに失敗した理由だと思います.コードを洗練して忘却させました.

4

3 に答える 3

6

Sharp_net へのコメントに基づいて、データバインディングはフィールドではなくプロパティで機能します。

これからクラスを変更します。

public class QHQuad {
  public int QH;
  public string Ph1;
  public string Ph2;
  public string Ph3;
}

これに:

public class QHQuad {
  public int QH {get; set;}
  public string Ph1 {get; set;}
  public string Ph2 {get; set;}
  public string Ph3 {get; set;}
}

INotifyPropertyChangedインターフェイスの実装も検討する必要があります。

于 2012-08-20T23:02:35.073 に答える
2

列名のスペルを間違えると、"ex.Message = "DataSource のプロパティまたは列 numpmt にバインドできません。\r\nパラメーター名: dataMember" というエラーを再現できました。

列名が正しいことを確認してください。

于 2012-08-20T22:30:45.103 に答える
1

「DataSource のプロパティまたは列にバインドできません。パラメータ名: dataMember」というエラーが表示されました。-- ただし、リリース モードで実行している場合のみ。

このエラーをスローする参照ソースは、http: //referencesource.microsoft.com/#System.Windows.Forms/ndp/fx/src/winforms/Managed/System/WinForms/BindToObject.cs.htmlで参照できます。 CheckBinding() で発生します。

データ ソースが実際には null のときに、リリース モードでのみエラーが発生しました。バインディング ソースはデザイナで作成されていたので、MyForm.Designer.cs のどこかに

this.myBindingSource.DataSource = typeof(MyClass);

と MyForm.cs どこかで言った

this.myBindingSource.DataSource = null;

繰り返しますが、エラーはリリース モードでのみ発生し、ユーザーがエラー ダイアログで [終了] をクリックしない限り続行できたアプリケーションを停止しませんでした。

于 2014-07-11T07:18:24.310 に答える