2

ここでカスタム コントロールを作成するのが最初のコントロール コードです

1. StartScreen.cs および ActDesc.cs コントロール。

  1. ページが初めて読み込まれると、2 つの編集ボタンが表示されます。
  2. それらのいずれかをクリックすると、コンテンツが含まれるテキスト ボックスが表示されます。
  3. 次に、保存ボタンイベントが発生しない保存をクリックします。
  4. 最初の CreateChildControls 中に作成されたコントロールがイベントを発生させるように思えます。ポストバックで作成されたものはイベントを発生させません。
  5. 編集ボタンの Command イベント ハンドラーで ControlsCreate() メソッドを呼び出します。また、EnsureChildControls() 呼び出しを使用してみました。まだ役に立たない?

これを達成する方法について誰かが私を導くことができますか?

. .

public class Wrapper
{
    public string Name { get; set; }
    public string Description { get; set; }
}
namespace Cons
{
    public class StartScreen : CompositeControl
    {
        public StartScreen()
        {
            //
            // TODO: Add constructor logic here
            //
        }
        protected override void CreateChildControls()
        {
            List<Wrapper> list = new List<Wrapper>();
            for (int i = 0; i < 2; i++)
            {
                list.Add(new Wrapper { Name = "D", Description = "DDDDDDDDDD" });
            }
            ActDesc desc = new ActDesc(list);
            desc.DataBind();
            this.Controls.Add(desc);
            base.CreateChildControls();
        }
    }
}

public class ActDesc : CompositeControl
{
    IEnumerable<Wrapper> list = new Wrapper[] { };
    public ActDesc(IEnumerable<Wrapper> list)
    {
        this.list = list;
    }
    private void ControlsCreate()
    {
        this.Controls.Clear();
        Table activityDescription = new Table();
        int i = 1;
        foreach (var item in list)
        {
            TableRow tempRow = new TableRow();
            TableCell tempLeftCell = new TableCell();
            tempLeftCell.Text = item.Name;

            TableCell tempRightCell = new TableCell();
            tempRightCell.HorizontalAlign = HorizontalAlign.Right;

            if (EditId == 0)
            {
                ImageButton editButton = new ImageButton();
                editButton.ID = string.Format("editButton_{0}", i);
                editButton.ImageUrl = "add_16.png";
                editButton.CommandArgument = i.ToString();
                editButton.Command += new CommandEventHandler(editButton_Command);
                editButton.CommandName = "Edit";

                tempRightCell.Controls.Add(editButton);
            }
            else
            {
                if (EditId == i)
                {
                    ImageButton saveButton = new ImageButton();
                    saveButton.ID = string.Format("saveButton_{0}", i);
                    saveButton.ImageUrl = "~/save.png";
                    saveButton.CommandArgument = i.ToString();
                    saveButton.Command += new CommandEventHandler(editButton_Command);
                    saveButton.CommandName = "Save";

                    tempRightCell.Controls.Add(saveButton);
                }
            }

            tempRow.Cells.Add(tempLeftCell);
            tempRow.Cells.Add(tempRightCell);

            //Add the first row which contains the header name and the edit button if AllowEdit is true
            activityDescription.Rows.Add(tempRow);

            tempRow = new TableRow();

            tempLeftCell = new TableCell();
            tempLeftCell.ColumnSpan = 2;

            Control tempControl;
            if (EditId > 0 && EditId.Equals(i))
            {
                TextBox txt = new TextBox();
                txt.TextMode = TextBoxMode.MultiLine;
                txt.ID = "txt" + i;
                txt.Text = item.Description;
                tempControl = txt;
            }
            else
            {
                Literal litContent = new Literal();
                litContent.ID = string.Format("literalContent_{0}", i);
                litContent.Mode = LiteralMode.Transform;
                litContent.Text = item.Description;

                tempControl = litContent;
            }

            tempLeftCell.Controls.Add(tempControl);
            tempRow.Cells.Add(tempLeftCell);

            // Add the second row which shows the detailed HTML description..
            activityDescription.Rows.Add(tempRow);
            i = i + 1;
        }
        this.Controls.Add(activityDescription);
    }
    protected override void CreateChildControls()
    {
        ControlsCreate();
        base.CreateChildControls();
    }

    void editButton_Command(object sender, CommandEventArgs e)
    {
        switch (e.CommandName)
        {
            case "Edit":
                string id = e.CommandArgument.ToString();
                EditId = Convert.ToInt32(id);
                ControlsCreate();
                break;
            default:
                break;
        }
    }
    public int EditId
    {
        set
        {
            this.ViewState["__EditId"] = value;
        }
        get
        {
            return Convert.ToInt32(this.ViewState["__EditId"]);
        }
    }
    public bool AllowEdit { get; set; }
}
4

2 に答える 2

0

コントロールにイベントを持たせるには、イベントで宣言する必要があります。これは vb.net にありますが、 http ://converter.telerik.com/ で変換でき ます。これもコンポジットではなくスクリプトコントロールから継承しますが、同じように動作するはずです:

<Assembly: WebResource("myProject.FileUpload.css", "text/css", PerformSubstitution:=True)> 
< _
ToolboxData("<{0}:FileUpload ID='FileUpload{0}'  runat=""server""> </{0}:FileUpload>"), _
ClientCssResource("myProject.FileUpload.css")> _
Public Class FileUpload
    Inherits ScriptControl
    Implements INamingContainer, IPostBackEventHandler

    Private WithEvents btnMyButton As New Button

   .... 

    Protected Overrides Sub CreateChildControls()
        'method to create my controls
        createDynamicControls()

        'if you are using update panels and wish to do an async 
        ' post back, you must first register the conrol with 
        ' the pages script manager.  If you are not using update panels, you can
        ' skip this
        ScriptManager.GetCurrent(Page).RegisterAsyncPostBackControl(Me.btnMyButton)      

        MyBase.CreateChildControls()
    End Sub

   Protected Overrides Function SaveViewState() As Object
        Return New Pair(MyBase.SaveViewState(), Nothing)
    End Function


    Protected Overrides Sub LoadViewState(ByVal savedState As Object)
        MyBase.LoadViewState(CType(savedState, Pair).First)
        EnsureChildControls()
    End Sub

     Protected Overrides Sub OnInit(ByVal e As System.EventArgs)
        attachWebResources()
        MyBase.OnInit(e)

    End Sub

    Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
        MyBase.OnLoad(e)
    End Sub

     Private Sub attachWebResources()
        'use this to attach an embedded CSS file with the DLL
        Dim styleLink As String = "<link rel='stylesheet' text='text/css' href='{0}' />"
        Dim location As String = Page.ClientScript.GetWebResourceUrl(Me.[GetType](), "myProject.FileUpload.css")
        Dim styleInclude As New LiteralControl([String].Format(styleLink, location))
        DirectCast(Page.Header, HtmlControls.HtmlHead).Controls.Add(styleInclude)
    End Sub

     Protected Sub btnMyButton _click(ByVal sender As Object, ByVal e As EventArgs) Handles btnMyButton .Click

      '....do stuff
    end sub
        Public Sub RaisePostBackEvent(ByVal eventArgument As String) Implements System.Web.UI.IPostBackEventHandler.RaisePostBackEvent
          'required for IPostBackEventHandler
    End Sub

  Private Sub createDynamicControls()
     controls.Clear()
     'instantiate your control here and add it to the controls object
  end sub
end Class

これが役立つかどうか、またはどこかで立ち往生している場合はお知らせください。

于 2013-03-27T10:58:22.093 に答える
0

問題は、おそらく別の ID で再作成する ID を割り当てていないコントロールだと思います。したがって、以前のポストバック中に保存された値と一致しません。また、this.ChildControlsCreated=false を設定して子コントロールを再作成しながら、EnsureChildControls を呼び出すようにポストバック ハンドラーのコードを変更しました。

于 2013-04-04T07:23:53.480 に答える