0

私はそのような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>
4

2 に答える 2

0

コントロールを繰り返すことは私にはうまくいかなかったので、結局私はあきらめて、DBにもう一度問い合わせました...ええ、それはうまくいきます。

于 2012-08-28T11:59:04.480 に答える
0

私の仮定(コメントを参照)によると、私は小さなデモを行いました...

<asp:DynamicDataManager ID="DynamicDataManager1" runat="server">
        <DataControls>
            <asp:DataControlReference ControlID="GridView1" />
        </DataControls>
</asp:DynamicDataManager>
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
      DataKeyNames="ContactID" DataSourceID="EntityDataSource1" AllowPaging="true" 
       OnRowUpdating="GridView1_RowUpdating">
        <Columns>                
            <asp:DynamicField DataField="ContactID" ReadOnly="true" HeaderText="ContactID" />
            <asp:DynamicField DataField="Title" HeaderText="Title" />
            <asp:DynamicField DataField="FirstName" HeaderText="FirstName" />
            <asp:DynamicField DataField="LastName" HeaderText="LastName" />
            <asp:CommandField ShowEditButton="True" />
        </Columns>
</asp:GridView>
<asp:EntityDataSource ID="EntityDataSource1" runat="server" ConnectionString="name=dbTestIT34_EFEntities"
        DefaultContainerName="dbTestIT34_EFEntities" EnableFlattening="False" EnableUpdate="True"
        EntitySetName="Contacts" EntityTypeFilter="Contact">
</asp:EntityDataSource>

私のデータストレージによると、rowUpdating イベントを処理しました。残念ながら、動的コントロール内のコントロールにアクセスするのは簡単ではありません。だから私は非常に迅速で汚いハックをしました...

protected void Page_Init(object sender, EventArgs e)
{
    GridView1.EnableDynamicData(typeof(Contact));
    EntityDataSource1.ContextType = typeof(dbTestIT34_EFEntities);
}
protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
    int row = 0;
    int firstNameColumn = 2;
    while (row < GridView1.Rows.Count)
    {
        // sorry, a little bit confusing ...
        //     as dynamic control generates other controls dynamically, 
        //     this was the very first thing that worked for me!
        TextBox t = GridView1.Rows[row].Cells[firstNameColumn].Controls[0].Controls[0].Controls[0] as TextBox;
        if (t != null)
            Debug.WriteLine(t.Text);

        row++;
    }
}

それが役立つことを願っています!

于 2012-08-13T14:38:22.060 に答える