1

ASP.NETとC#でアプリケーションを開発しています。ページにグリッドビューがあります。その中で、私はリストボックスコントロールを持っており、デフォルトではEnabledプロパティがfalseで設定されています。チェックボックスコントロールのjavascript/jQueryからそのコントロールを有効または無効にしようとしています。

私のASPコード:

<asp:GridView ID="gvWhom" runat="server" AutoGenerateColumns="False" DataSourceID="odsWhom"
GridLines="None" Width="100%" OnRowDataBound="gvWhom_RowDataBound">
<Columns>
<asp:TemplateField>
    <HeaderTemplate>
    </HeaderTemplate>
    <ItemTemplate>
    <table width="100%" cellpadding="0" cellspacing="0" border="0">
        <tr style="height: 25px;">
        <td width="20%">
            <asp:CheckBox ID="chkCriteria" runat="server" Text='<%#Eval("TargetType") %>' />
        </td>
        <td width="80%">
            <asp:ListBox ID="lbCriteria" runat="server" CssClass="ddl" Width="150px" Height="50px"
            Enabled="false" SelectionMode="Multiple"></asp:ListBox>
        </td>
    </table>
    </ItemTemplate>
    <HeaderStyle Height="2px" />
</asp:TemplateField>
</Columns>
</asp:GridView>

Javascriptコード:

function disableDropDown(chkCriteria, lbCriteria) {
    if (document.getElementById(chkCriteria).checked) {         
     document.getElementById(lbCriteria).removeAttribute('disabled');
    }else{
     document.getElementById(lbCriteria).value = -1;
     document.getElementById(lbCriteria).disabled = true;
    }
    return true;
}

C#コード:

protected void gvWhom_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
    ListBox lbCriteria = (ListBox)e.Row.FindControl("lbCriteria");
    CheckBox chkCriteria = (CheckBox)e.Row.FindControl("chkCriteria");
    chkCriteria.Attributes.Add("onchange", "javascript:return disableDropDown('" + chkCriteria.ClientID + "', '" + lbCriteria.ClientID + "')");
    }
}

上記のコードを使用して、リストボックスコントロールを有効/無効にすることができます。しかし、コントロールを有効にして複数のアイテムを選択し、フォームを送信すると、リストボックスの選択されたアイテムを見つけることができません。

リストボックスの選択したアイテムを取得するにはどうすればよいですか?または有効にする他の方法はありますか?リストボックスコントロールを無効にして、選択したアイテムをc#コードで取得しますか?

4

1 に答える 1

0

これはほとんど推測ですが、試してみる価値はあります...

ここでは、サーバー側でコントロールを無効にしています。

<asp:ListBox ID="lbCriteria" runat="server" CssClass="ddl" Width="150px" Height="50px"
        Enabled="false" SelectionMode="Multiple"></asp:ListBox>

これEnabled="false"は、このコントロールを追跡する必要がないこと、変更が加えられないことを ASP.NET に示している可能性があります。そのため、サーバーにポストバックしたときにデータが返されない可能性があります。

サーバー (ASP.NET) の観点からコントロールを有効に保ち、クライアント (JavaScript) 側で完全に UI の有効化/無効化を維持してみましょう。ASP.NET の組み込みフレームワークを本質的に削除して、追跡するデータに関する意思決定を行います。

サーバー側コントロール マークアップでコントロールを有効にすることから始めます。

<asp:ListBox ID="lbCriteria" runat="server" CssClass="ddl" Width="150px" Height="50px"
        SelectionMode="Multiple"></asp:ListBox>

残りは JavaScript によって処理されます。クライアント側でコントロールを有効/無効にする JavaScript コードが既にいくつかありますね。そのため、後は、ページが最初にブラウザーにロードされたときに、コントロールのすべてのインスタンスに対して同じ JavaScript を呼び出して、クライアント側のコントロールを無効にするだけです。これはあなたが望む部分です:

document.getElementById(lbCriteria).value = -1;
document.getElementById(lbCriteria).disabled = true;

さて、あなたはサーバー側のコードから JavaScript イベントをバインドしているように見えますが、その方法は私にとって特に直感的ではないため、私はあまり役に立ちません。(これは JavaScript と C# を混ぜ合わせたもので、少し後ろ向きに感じます。) したがって、あなたがどのようなアプローチを取るかは完全にはわかりません。

基本的に、コントロールのすべてのインスタンスに対してこれら 2 行の JavaScript を呼び出し、ページがブラウザーに読み込まれるとすぐに実行する必要があります。

jQuery では、次のようにします。

$(function () {
    $('select.ddl').attr('disabled', 'disabled');
});

これは、DOM がロードされたときに実行され、disabled属性を追加します (値は"disabled"to every selectwith class ddl.

于 2013-02-09T13:54:03.203 に答える