3

ObjectDataSource にバインドされた DropDown があります。そのデータ バインド イベントで、0 インデックスに「--select--」値を追加しています。ページに LinkBut​​ton があり、そのクライアントのクリックで、ドロップダウンで別の項目を選択しています (JavaScript を使用)。--select--、option1、option2、option3 のような 3 つの項目があり、リンク ボタンのクライアント クリックで option3 を選択したとします。デフォルト値の「--select--」を選択すると、SelectedIndexChanged イベントは発生しません。 . 他の値を選択すると、起動します。デフォルト値で機能しないのはなぜですか?

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack && !IsCallback)
    {
      this.FillDropDown("--Select--");
    }
    else
    {                            
        if (this.drp.SelectedItem != null)
            this.FillDropDown(this.drp.SelectedItem.Text);
        else
            this.FillDropDown("--Select--");
    }
}

protected void FillDropDown(string viewName)
{       
    this.obJectDataSource.Select();

    this.drp.Items.Clear();
    this.drp.SelectedIndex = -1;
    this.drp.DataBind();

    if (this.drp.Items.Count > 0)
    {           
        ListItem item = this.drp.Items.FindByText(viewName);
        if (item == null)
        {
            item = this.drp.Items.FindByText("--Select--");
        }
        if (item != null)
        {
            int selectedIndex = this.drp.Items.IndexOf(item);
            this.drp.Items[selectedIndex].Selected = true;
            this.drp.SelectedIndex = selectedIndex;                        
        }
    }
}

protected void drp_OnDataBound(object sender, EventArgs e)
{
    if (this.drp.Items.Count > 0)
    {               
        this.drp.Items.Insert(0, new ListItem("--Select--", "-1"));                
    }                        
}

protected void drp_SelectedIndexChanged(object sender, EventArgs e)
{            
    if (drp.SelectedValue != "-1")
    {
        Session["SelectedItem"] = this.drp.SelectedItem.Text;

    }            
}
/// The button which do callback not postback

<dx:ASPxCallback ID="ASPxCallback1" runat="server" ClientInstanceName="Callback1" OnCallback="SaveFilter_Click">
    <ClientSideEvents CallbackComplete="function(s,e){Callback1Success(s,e);}" />
</dx:ASPxCallback>

<dx:ASPxButton ID="btn_Save" runat="server" CausesValidation="False" Height="20px" Text="Save" AutoPostBack="false" UseSubmitBehavior="false">
    <ClientSideEvents Click="function(s, e) {
            var isValid =  Validate(this, txt1.GetText());
            if(isValid==true) {
                Callback1.PerformCallback('Save');                               
            }  
            else {
                e.processOnServer = false;
            }}">
    </ClientSideEvents>
</dx:ASPxButton>

protected void SaveFilter_Click(object sender, CallbackEventArgs e)
{
    if (e.Parameter.ToString() == "Save")
    {
        if (!string.IsNullOrEmpty(txt_SaveSaveSearch.Text))
        {
            // saving data into data base.
            this.FillDropDown(txt.Text);                    
            e.Result = ASPxCallback.GetRenderResult(this.drp);
        }
    }
}

function Callback1Success(s,e) {
     var ctrl = document.getElementById('ctl00_ContentHolder_drp');
     ctrl.outerHTML = e.result;        
}
4

4 に答える 4

7

アップデート:

改訂された質問に基づく-

  1. ドロップダウンリストにAppendDataBoundItemsを設定してみませんか?このプロパティを使用すると、ドロップダウンリストで既存のアイテムにアイテムを追加できます。

    <asp:DropDownList ID='DropDownList1' runat='server' AutoPostBack='true'  EnableViewState='true' AppendDataBoundItems='true'>
    
        <asp:ListItem Selected='True' Text='--Select--' Value='1'></asp:ListItem></asp:DropDownList>
    
  2. Page_Loadメソッドはあなたが望むことをしません。それらのelse部分は、それらの1つがtrueであっても実行されます。例:「Postbacktrue」または「callbacktrue」の場合、else部分に入ります。ただし、(1)の手順で提案されているように、AppendDataBoundItemsを設定し、コードを削除して「--select--」を追加します。


最も可能性の高い問題はViewStateにあり、EnableViewState="true"を設定します

<%@ Page Title="" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Test.aspx.cs" EnableViewState="true"%>

また、Maste Pagesを使用している場合は、それも有効にする必要があります。

<%@ Master Language="C#" AutoEventWireup="true" CodeFile="Site.master.cs" Inherits="Site" EnableViewState="true" ClassName="Site" %>

そして、ドロップダウンWebコントロールでAutoPostback = "true"

<asp:DropDownList ID='DropDownList1' runat='server' AutoPostBack='true' 
    OnSelectedIndexChanged='HandleOnDropDownListSelectedIndexChanged'>
</asp:DropDownList>
于 2011-02-10T07:32:53.200 に答える
3

他の誰かが私と同じ問題を抱えているかどうかはわかりませんが、たまたまドロップダウン リストの各項目の値が同じで、値を変更するまでイベントが発生しませんでした。

于 2011-05-24T02:41:06.143 に答える
1

これのもう 1 つの原因は、ページに複数のフォームがある場合です... ID またはアクションがまだないページに 2 番目のフォームを配置しました。このフォームは、onselectedindexchanged ハンドラを起動しようとしていたコントロールを含むフォームに干渉していました...

他のすべてが失敗した場合は、マークアップに SINGLE フォームのみがあることを確認してください。

于 2013-10-29T19:33:54.777 に答える
0

同じ問題が発生しました。しばらく掘り下げてみると、デザイナーコードが.aspxで行った変更と同期していないことがわかりました。その背後にあるコードには、削除されたコントロールへの参照がまだ含まれているため、オブジェクト参照が発生していません。オブジェクトエラーのインスタンスに設定されますが、これは実際の問題とは関係のない特殊なケースの処理で発生します(onselectionchangedは起動しません)。

...しかし、削除したコントロールの古い参照がまだ含まれているjscriptが.aspxにあることにも気づきました。これは実行時にのみキャッチされるJavaScriptであるため、コンパイラはエラーを表示しませんでした。したがって、私の場合、javascriptの問題が自動ポストバックイベントを妨げていると結論付けました。

于 2013-02-21T18:54:54.047 に答える