私はそのようなDynamicFieldsの束を持つGridViewを持っています。
<asp:GridView ID="GridView1" runat="server" DataSourceID="GridDataSource">
<Columns>
<asp:DynamicField HeaderText="Date Submitted" DataField="DATE_CREATED" />
<asp:DynamicField HeaderText="Assigned To" DataField="ASSIGNED_TO" />
<asp:DynamicField HeaderText="Active Account" DataField="Active_Account" />
<asp:DynamicField HeaderText="Client ID" DataField="CLIENT_ID" />
<asp:DynamicField HeaderText="Client Type" DataField="CLIENT_Type" />
</Columns>
</asp:GridView>
<asp:EntityDataSource ID="GridDataSource" OnSelected="TotalRows" runat="server"
EnableDelete="true">
<WhereParameters>
<asp:DynamicControlParameter ControlID="FilterRepeater" />
</WhereParameters>
</asp:EntityDataSource>
正常に表示されるようになりました。正しいデータが画面に表示されますが、行番号を使用してそのデータにアクセスしようとすると、常に空白のセルが見つかります。たとえば、次のようにしてすべてのセルをチェックしましたが、役に立ちませんでした。
Dim x As Integer = 0
Dim y As Integer = 0
While x < GridView1.Rows.Count
While y < GridView1.Rows(x).Cells.Count
If Not (GridView1.Rows(x).Cells(y).Text = "") Then
MsgBox(String.Format("{0},{1},{2}", x.ToString, y.ToString,
GridView1.Rows(x).Cells(y).Text))
End If
y = y + 1
End While
x = x + 1
y = 0
End While
メッセージ ボックスが表示されないため、すべてのセルが空の文字列です。しかし、それらが画面に表示されていることがはっきりとわかります。私は何を間違っていますか?
アップデート
Pilgerstorfer Franz が Textbox 要素を探すように提案した後、次のコードを使用しました。これは、基本的にテーブル内のすべてのセルを調べて、それらからデータを取得しようとし、空白でない場合は msgbox を表示します (新しいコントロールについても通知します)。私は説明していません);
If GridView1.Rows(0).RowType = DataControlRowType.DataRow Then
For r = 0 To GridView1.Rows.Count - 1
For c = 0 To (GridView1.Rows(r).Cells.Count - 1)
Dim cell = GridView1.Rows(r).Cells(c)
For b = 0 To cell.Controls.Count - 1
If (cell.Controls(b).GetType() Is GetType(TextBox)) Then
Dim td = CType(cell.Controls(b), TextBox)
Text = td.Text.Trim
ElseIf (cell.Controls(b).GetType() Is GetType(LiteralControl)) Then
Dim td = CType(cell.Controls(b), LiteralControl)
Text = td.Text.Trim
ElseIf (cell.Controls(b).GetType() Is GetType(DynamicControl)) Then
Dim td = CType(cell.Controls(b), DynamicControl)
Text = td.Table.Columns.Item(c).DisplayName()
Else
MsgBox(String.Format("New Control of type: {0}", cell.Controls(b).GetType().FullName))
End If
If Not Text = "" Then
MsgBox(String.Format("{0},{1},{2}", c.ToString, b.ToString, Text))
End If
Next
Next
Next
End If
残念ながら、ほとんどのセルには DynamicControl が含まれているDisplayName
だけText
でした。では、DynamicControl からテキスト値プロパティを取得するにはどうすればよいでしょうか?
追加情報
これは私が更新しているプロジェクトであるため、2行の初期コードがあるため、この問題にさらに混乱しています。
Dim UserID = Convert.ToInt32(GridView1.DataKeys(e.RowIndex).Value)
Dim clientType As String = GridView1.DataKeys(e.RowIndex).Item(1).ToString
これらは UserID と ClientType を正常に戻します。今、私はDataKeysをよく理解していませんが、使ってみました;
Dim clientType As String = GridView1.DataKeys(e.RowIndex).Item(Num).ToString
whereNum
は、残りの行データが返されることを期待するたびに 1 ずつ増加しますが、単にインデックスが範囲外であるというエラーが発生しました。
別の更新!!
これは ASPX ページの別の部分ですが、それが何をするのか完全にはわかりません。Pilgerstorfer Franz は、dynamicControl によって作成されたテキスト ボックスを探すコードをいくつか作成しました。ここで、このコードにより、テキスト ボックスではなく他の種類のコントロールが使用されるようになるのではないかと考えています。考え?
<asp:FilterRepeater ID="FilterRepeater" runat="server" Visible="false">
<ItemTemplate>
<h2><asp:Label ID="lblDisplay" runat="server" Text='<%#
Eval("DisplayName") %>' AssociatedControlID="DynamicFilter$DropDownList1" /></h2>
<asp:DynamicFilter runat="server" ID="DynamicFilter"
OnSelectedIndexChanged="OnFilterSelectedIndexChanged" />
</ItemTemplate>
<FooterTemplate><br /><br /></FooterTemplate>
</asp:FilterRepeater>