2

ObjectDataSource を使用して、オブジェクトを GridView にバインドしています。OnRowDataBound イベント ハンドラーで、特定のボタンを表示するかどうかを決定しようとしています。ランタイムがこのステートメントに遭遇すると、「タイプ 'Pledge' のデフォルト メンバーが見つかりません」というメッセージが表示されます。エラー:

lbDel.Visible = Not (e.Row.DataItem("BillingReady"))

GridView にバインドされている私のオブジェクト クラス:

public class Pledges : System.Collections.CollectionBase
{
    public Pledge this[int index]
    {
        get { return ((Pledge)(List[index])); }
        set { List[index] = value; }
    }

    public int Add(Pledge pledge)
    {
        return List.Add(pledge);
    }
}

私の誓約クラス:

public class Pledge
{
    public int PledgeID { get; set; }
    public int EventID { get; set; }
    public int SponsorID { get; set; }
    public int StudentID { get; set; }
    public decimal Amount { get; set; }
    public string Type { get; set; }
    public bool IsPaid { get; set; }
    public string EventName { get; set; }
    public DateTime EventDate { get; set; }
    public bool BillingReady { get; set; }
    public string SponsorName { get; set; }
    public int Grade_level { get; set; }
    public string StudentName { get; set; }
    public string NickName { get; set; }
    public int Laps { get; set; }
    public decimal PledgeSubtotal { get; set; }
}

私の OnRowDataBound イベント ハンドラ:

Protected Sub PledgeGrid_OnRowDataBound(ByVal sender As Object, ByVal e As GridViewRowEventArgs)
    If (e.Row.RowType = DataControlRowType.DataRow) And _
      Not ((e.Row.RowState = DataControlRowState.Edit) Or ((e.Row.RowState = DataControlRowState.Alternate) And (e.Row.RowState = DataControlRowState.Edit))) Then
        Dim lbDel As LinkButton
        Dim lbEd As LinkButton
        lbDel = CType(e.Row.FindControl("lbDelete"), LinkButton)
        lbEd = CType(e.Row.FindControl("lbEdit"), LinkButton)

        If ((e.Row.RowState = DataControlRowState.Normal) Or (e.Row.RowState = DataControlRowState.Alternate)) Then
            lbDel.Visible = Not (e.Row.DataItem("BillingReady"))    '<-- Problem happens here
            lbEd.Visible = Not (e.Row.DataItem("BillingReady"))
        End If
    End If
End Sub

はい、VB と C# を混在させる必要がありますが、それは問題ではないと思います。VB のデフォルト プロパティに相当する C# を理解している場合、インデクサーと呼ばれます。これはインデクサーとしての資格があるべきではありませんか?

public Pledge this[int index]
{
    get { return ((Pledge)(List[index])); }
    set { List[index] = value; }
}
4

2 に答える 2

5

にキャストしてみてDataItemくださいPledge

Dim pledge = DirectCast(e.Row.DataItem, Pledge)
lbDel.Visible = Not pledge.BillingReady
于 2012-04-04T22:38:02.920 に答える