1

テキストボックスへのスキャン入力を受け入れるページに取り組んでいます。入力がテキスト ボックスに入力されると、入力項目の追加フィールドを含むユーザー コントロールが自動ポストバックによって動的に生成されます。ユーザー コントロールには、項目 (それ自体) を削除するためのリンク ボタンも含まれています。このボタンをクリックすると、親にバブルアップするはずの「削除」イベントが生成されます。

残念ながら、これは起こらないようです - 削除処理コードに到達することはありません。私の理解では、ページの読み込み時にコントロールがまだ生成されていないため、イベント ハンドラーはまだ作成されていません。しかし、ページの読み込み時にどのコントロールを生成する必要があるかわからないため (ユーザー入力がまだ処理されていないため)、ユーザー コントロールを生成するコードを PageLoad に移動することはできません。

これはどのように処理する必要がありますか?私はこれについて間違った方法で進んでいますか?関連するコードのほとんどを以下に示します。

助けてくれてありがとう!

page.aspx:

Enter SKU (tab to enter): 
<asp:TextBox ID="EntryTextBox" CssClass="textbox" AutoPostBack="true" OnTextChanged="newItem" runat="server"></asp:TextBox>
<asp:Panel ID="itempanel" runat="server">
</asp:Panel>

page.aspx.cs:

protected void newItem(object sender, EventArgs e)
{
    // we need to store item entries in ViewState so they comeback on postback;
    // they can't be stored in the controls themselves as the controls will
    // disappear
    ViewState["skus"] += "\t" + EntryTextBox.Text;
    ViewState["descs"] += "\t" + itemLookup(EntryTextBox.Text);
    // ...more item descriptors...
    updateItemPanel();
}

protected void updateItemPanel()
{
    // generate a control for each item entered in ViewState
    itempanel.Controls.Clear();
    List<string> skus = new List<string>(ViewState["items"].ToString().Substring(1).Split('\t'));
    List<string> descs = new List<string>(ViewState["descs"].ToString().Substring(1).Split('\t'));
    // ...more item descriptors...
    int i = 0;
    foreach (string sku in skus)
        {
            item newitemctrl = (item)Page.LoadControl("~/item.ascx");
            newitemctrl.line = (i + 1).ToString();
            newitemctrl.sku = skus[i];
            newitemctrl.description = descs[i];
            // ...more item descriptors...
            newitemctrl.deleteLinkClicked += new EventHandler(deleteClicked);
            itempanel.Controls.Add(newitemctrl);
            i++;
        }
    }

    protected void deleteClicked(object sender, EventArgs e)
    {
        List<string> skus = new List<string>(ViewState["skus"].ToString().Substring(1).Split('\t'));
        List<string> descs = new List<string>(ViewState["descs"].ToString().Substring(1).Split('\t'));
        // ...more item descriptors...
        item olditemctrl = (item)sender;
        skus.RemoveAt(Convert.ToInt32(olditemctrl.number) - 1);
        descs.RemoveAt(Convert.ToInt32(olditemctrl.number) - 1);
        ViewState["skus"] = skus.ToString();
        ViewState["descs"] = descs.ToString();
        updateItemPanel();
    }

item.ascx:

<asp:LinkButton ID="DeleteLinkButton" runat="server" onclick="DeleteLinkButton_Click">Delete</asp:LinkButton>

item.ascx.cs:

    public event EventHandler deleteLinkClicked;

    protected void DeleteLinkButton_Click(object sender, EventArgs e)
    {
        if (this.deleteLinkClicked != null)
        {
            this.deleteLinkClicked(new object(), new EventArgs());
        }
    }
4

1 に答える 1

2

これをonclickイベントとして追加することにより、JavaScriptでポストバックイベントをディスパッチできます。

__doPostBack("<%= button.ClientID %>", "");

DoPostBack には 2 つの引数があります。1 つ目は ID、2 つ目はイベント名です。私はこのソリューションをうまく使いました。

詳細については、こちらをご覧ください。

注: これ自体はイベントを自動的に発生させませんが、ページの Load イベントで何が発生するかを確認できます。次のように引数を取得できます: : Request.Form["__EVENTTARGET"] フォーム データに完全にアクセスできるため、動的に作成されたコントロールから値を取得することもできます。

于 2013-09-17T17:36:48.427 に答える