2012-08-13 18 views
0

我有一堆DynamicFields像這樣的GridView;從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 

沒有消息框顯示,所以所有的單元格都是空字符串。但我可以清楚地看到他們在屏幕上填充!我究竟做錯了什麼?

UPDATE

,我找文本框元素我用下面的代碼基本上看錶中的所有單元格,並嘗試對提取數據出來他們與Pilgerstorfer弗朗茨建議後,如果它不是空白,則顯示一個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因爲我是把DisplayNameText我每次剛開列標題。那麼如何從DynamicControl中獲取文本值屬性?

附加信息

我對這個問題進一步的困惑,因爲因爲這是我更新項目有最初的兩行代碼,其中有;

Dim UserID = Convert.ToInt32(GridView1.DataKeys(e.RowIndex).Value) 
Dim clientType As String = GridView1.DataKeys(e.RowIndex).Item(1).ToString 

這些成功返回UserID和ClientType。現在我不太瞭解DataKeys,但我嘗試過使用;

​​

其中Num通過增加每次一個期待它帶回行數據的休息,但我只是得到了一個索引超出範圍的錯誤。

其他更新!

這是ASPX頁面的另一部分,但我不完全確定它的功能。 Pilgerstorfer Franz創建了一些代碼來查找由dynamicControl創建的文本框。現在我想知道這裏的代碼是否會導致使用其他類型的控件而不是Textboxes。思考?

<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> 
+0

注意:在ASP.NET中使用Msgbox沒有任何意義(並且在除服務器之外的其他計算機上不起作用)。你應該爲這個使用一個Javascript警報:'ClientScript.RegisterStartupScript(Me.GetType(),「AlertMessageBox」,「alert('oops');」,True)' – 2012-08-13 09:38:44

+0

你使用什麼事件代碼? (page_load,Button_click ...) – 2012-08-13 09:58:25

+0

'Protected Sub GridView1_Updating(ByVal sender As Object,ByVal e As System.Web.UI.WebControls.GridViewUpdateEventArgs)Handle GridView1.RowUpdating' is my my stub which which from a'LinkBut​​ton' – windowskm 2012-08-13 10:08:27

回答

0

迭代通過控件從來沒有爲我工作,所以最終我放棄了,只是再次查詢數據庫......呃它的工作原理。

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++; 
    } 
} 

希望幫助!

+0

感謝您的回答!我在VB中重寫了你的代碼,如下所示:Dim row As Integer = 0 Dim firstNameColumn As Integer = 2 Dim t As TextBox While(row windowskm 2012-08-13 14:55:04

+0

但不幸的是,它沒有遇到任何帶有文本的文本框。可以理解爲什麼閱讀網格很困難:/ – windowskm 2012-08-13 14:57:14

+0

上面的另一個更新。 – windowskm 2012-08-13 15:14:42