2017-09-25 6 views
0

ドキュメントを構築するWebアプリケーションを構築しています。文書には段落(外側のリピータ)とサブパラグラフ(内側のリピータ)があります。私が探しているのは、既存の文書に空のサブパラグラフを追加する方法です。実行時にネストされたリピータの内部リピータに行を追加するC#

私のマークアップ:

<asp:Repeater ID="ParagraphRepeater" runat="server" 
    OnItemDataBound="ParagraphRepeater_ItemDataBound" > 
    <ItemTemplate> 
     <asp:TextBox ID="ParagraphTitleTextBox" runat="server" Font-Bold="true" Width="300px" 
      Text='<%# Eval("ParagraphTitle") %>'></asp:TextBox> 
     <br /> 
     <asp:TextBox ID="ParagraphTextTextBox" runat="server" TextMode="MultiLine" Wrap="true" 
         width="1100px" Height="50px" Text='<%# Eval("ParagraphText") %>'></asp:TextBox> 
     <asp:Button ID="DeleteParagraphButton" runat="server" Text="Delete" OnClick="DeleteParagraphButton_Click" /> 
     <asp:Repeater ID="SubParagraphRepeater" runat="server" DataSourceID="SubParagraphSqlDataSource"> 
      <ItemTemplate> 
       <div style="margin-left: 30px"> 
        <asp:TextBox ID="SubParagraphTitleTextBox" runat="server" Font-Underline="true" Width="200px" 
            Text='<%# Eval("SubParagraphTitle") %>'></asp:TextBox> 
        <br /> 
        <asp:TextBox ID="SubParagraphTextTextBox" runat="server" TextMode="MultiLine" Wrap="true" 
            Width="1050px" Height="50px" Text='<%# Eval("SubParagraphText") %>'></asp:TextBox> 
        <asp:Button ID="DeleteSubParagraphButton" runat="server" Text="Delete" 
            OnClick="DeleteSubParagraphButton_Click" /> 
        <br /> 
       </div> 
      </ItemTemplate> 
     </asp:Repeater> 
     <br /> 
     <br /> 
     <br /> 
    </ItemTemplate> 

マイコード:

protected void MultiView1_ActiveViewChanged(object sender, EventArgs e) 
{ 
    if (MultiView1.GetActiveView() == InputView) 
    { 
     BuildParagraphDataTable(); 
     BuildSubParagraphDataTable(); 

     if (RevisionsDropDownList.SelectedValue == "0") 
     { 
      // User is creating a new document 
      // Call method to create a datatable for the form row 
      SetFormRow(); 

      // Call method to create a datatable for the paragraph row 
      AddParagraph(); 

      DataTable dt = (DataTable)ViewState["ParagraphTable"]; 
      ParagraphRepeater.DataSource = dt; 
      ParagraphRepeater.DataBind(); 

     } 
     else 
     { 
      // User is opening an existing document 
      // Get the formId and save it to ViewState 
      int formId = Convert.ToInt32(RevisionsDropDownList.SelectedValue); 
      ViewState["FormId"] = formId.ToString(); 

      // Bind the Paragraph repeater to its sqlDataSource 
      ParagraphRepeater.DataSource = ParagraphSqlDataSource; 
      ParagraphRepeater.DataBind(); 
     } 
    } 
} 
protected void AddParagraph() 
{ 
    int paragraphId; 

    DataTable dt = (DataTable)ViewState["ParagraphTable"]; 
    DataRow dr = dt.NewRow(); 

    if (ViewState["ParagraphId"] != null) 
     paragraphId = Convert.ToInt32(ViewState["ParagraphId"]); 
    else 
     paragraphId = 0; 

    paragraphId--; 

    int formId = Convert.ToInt32(ViewState["FormId"]); 

    dr["ParagraphId"] = paragraphId; 
    dr["FormId"] = formId; 
    dr["ParagraphTitle"] = string.Empty; 
    dr["ParagraphText"] = string.Empty; 
    dr["CreatorId"] = string.Empty; 
    dr["RevisorId"] = string.Empty; 
    dt.Rows.Add(dr); 

    ViewState["ParagraphTable"] = dt; 
    ViewState["ParagraphId"] = paragraphId; 

} 
protected void AddSubParagraph() 
{ 
    DataTable dt = (DataTable)ViewState["SubParagraphTable"]; 
    DataRow dr = dt.NewRow(); 

    int paragraphId = Convert.ToInt32(ViewState["ParagraphId"]); 

    dr["ParagraphId"] = paragraphId; 
    dr["SubParagraphTitle"] = string.Empty; 
    dr["SubParagraphText"] = string.Empty; 
    dr["CreatorId"] = string.Empty; 
    dr["RevisorId"] = string.Empty; 
    dt.Rows.Add(dr); 

    ViewState["SubParagraphTable"] = dt; 
} 

protected void ParagraphRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
    { 
     AddParagraph(); 
     DataTable parentDataTable = (DataTable)ViewState["ParagraphTable"]; 
     DataRow lastDTRow = parentDataTable.Rows[parentDataTable.Rows.Count - 1]; 

     int paragraphId = (int)ViewState["ParagraphId"]; 
     DataRowView thisParagraphRowView = (DataRowView)e.Item.DataItem; 

     paragraphId = (int)thisParagraphRowView.Row["ParagraphId"]; 

     lastDTRow["ParagraphId"] = thisParagraphRowView.Row["ParagraphId"]; 
     lastDTRow["FormId"] = thisParagraphRowView.Row["FormId"]; 
     lastDTRow["ParagraphTitle"] = thisParagraphRowView.Row["ParagraphTitle"]; 
     lastDTRow["ParagraphText"] = thisParagraphRowView.Row["ParagraphText"]; 

     ViewState["ParagraphTable"] = parentDataTable; 
     ViewState["ParagraphId"] = paragraphId.ToString(); 

     DataTable childDataTable; 
     DataRowView thisSubParagraphRowView; 

     Repeater childRepeater = (Repeater)e.Item.FindControl("SubParagraphRepeater"); 

     foreach (RepeaterItem item in childRepeater.Items) 
     { 
      if (item.ItemType == ListItemType.Item || item.ItemType == ListItemType.AlternatingItem) 
      { 
       thisSubParagraphRowView = (DataRowView)item.DataItem; 
       if (thisSubParagraphRowView != null) 
       { 
        AddSubParagraph(); 
        childDataTable = (DataTable)ViewState["SubParagraphTable"]; 
        lastDTRow = childDataTable.Rows[childDataTable.Rows.Count - 1]; 

        lastDTRow["ParagraphId"] = thisSubParagraphRowView.Row["ParagraphId"]; 
        lastDTRow["SubParagraphTitle"] = thisSubParagraphRowView.Row["SubParagraphTitle"]; 
        lastDTRow["SubParagraphText"] = thisSubParagraphRowView.Row["SubParagraphText"]; 

        ViewState["SubParagraphTable"] = childDataTable; 
       } 
      } 
     } 
    } 
} 

ユーザーが既存のフォームを開くと、itemDataBoundコードは段落やサブパラグラフのためのDataTableに移入されます。

ユーザーが新しいフォームを作成すると、setForm()メソッドとaddParagraph()メソッドが呼び出され、フォームIDが作成され、空の段落が追加されます。空白のサブパラグラフは追加されません。ユーザーはボタンをクリックする必要があります。

データモデルには、1つのフォーム(ユーザーがddlから選択)があります。フォームは1〜複数の段落を持ち、段落は0〜複数の段落を持つことができます。

外側リピータの特定の行(カーソルが現在位置している段落、またはカーソルがサブパラグラフの親段落にある場合)の空白行を内側のリピータに作成する必要があります。それ、どうやったら出来るの?私はGoogleで掘り下げたが、この問題に対処するエントリを見つけることができませんでした。ありがとう。

+0

これはjavascriptやjqueryで実行できる方法はありますか? –

答えて

0

答えは、「AddSubParagraph」ボタンをスタンドアロンの位置から外側のリピータの内側に移動することです。こうすることで、ボタンの「NamingContainer」属性を使用してリピーターを見つけることができます。次に内側のリピータRepeater innerRepeater = (Repeater)outerRepeater.FindControl("childRepeater");を見つけてそれに行を追加することです。私は行を追加することができますが、内部リピータのDataBindingに問題があります。

私が行うことは、各リピータのviewstateにデータテーブルを保持し、リピータとデータテーブルの間でデータをミラーリングすることです。私は行を追加する必要があるとき、私はそれをデータテーブルに追加し、データテーブルにリピータをデータバインドします。しかし、私はエラーが表示されます。エラーが発生した行はchildRepeater.Datasource = dt;です。エラーは "DataSourceとDataSourceIdの両方が定義されています。一つの定義を削除してください。" DataSourceIdはマークアップ内のchildRepeaterで定義され、SQLDataSourceをポイントします。ですから、検索時に内部リピータをそのSQLDataSourceにバインドする方法を見つける必要があります。

1つの問題:私は、データバインディングを行うためにItemDataBoundイベントを使用すると思います。しかし、私はすでにそこに多くのコードを持っています(上記参照)。私が使用できる別のイベントがありますか?

関連する問題