2012-08-13 5 views
0

나는 GridView와 같이 DynamicField를 많이 가지고 있습니다.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을 포함하고 내가 TextDisplayName을 가하고 이후 난 그냥 열 머리글마다 시간을 얻고 있었다. 그렇다면 DynamicControl에서 텍스트 값 속성을 어떻게 가져 옵니까?

추가 정보

이 내가 통해 업데이트 프로젝트이기 때문에 어느있는 초기 코드 두 줄이 있기 때문에 나는이 문제로 더 혼란 스러워요;

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 

Num 행 데이터의 나머지 부분을 다시 가지고 그것을 기대 한마다 씩 증가,하지만 난 단순히 인덱스가 범위를 초과 오류로했다 얻었다.

다른 업데이트!

여기 ASPX 페이지의 또 다른 비트가 있지만 그게 무슨 일인지 완전히 확신하지는 못합니다. Pilgerstorfer Franz는 dynamicControl에 의해 만들어진 텍스트 상자를 찾을 수있는 코드를 만들었습니다. 이제이 코드로 Textbox가 아닌 다른 유형의 컨트롤이 사용되는지 궁금합니다. 생각? 내 가정 (주석 참조) 난 작은 데모를했다 따르면

<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를 사용하는 것은 의미가 없으며 서버가 아닌 다른 컴퓨터에서는 작동하지 않습니다. 'ClientScript.RegisterStartupScript (Me.GetType(), "AlertMessageBox", "alert ('oops');", True)' –

+0

코드에 어떤 이벤트를 사용합니까? (page_load, Button_click ...) –

+0

'Protected Sub GridView1_Updating (ByVal 보낸 사람 Object, ByVal e As System.Web.UI.WebControls.GridViewUpdateEventArgs) GridView1.RowUpdating 처리'는 LinkButton에서 오는 내 스텁입니다 – windowskm

답변

0

컨트롤을 반복 해 본 적이 없으므로 결국에는 포기하고 DB를 다시 질의했습니다 ... 작동합니다.

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 TextBox로 TextBox While (row windowskm

+0

하지만 유감스럽게도 텍스트 상자에 텍스트가있는 것은 아닙니다. 그리드를 읽는 것이 왜 그렇게 어려운지 이해할 수 있습니다./ – windowskm

+0

위의 또 다른 업데이트. – windowskm

관련 문제