2013-02-09 60 views
1

我正在開發ASP.NET & c#中的應用程序。我在我的頁面中有一個網格視圖。在這我有一個列表框控制和默認啓用屬性設置虛假。我試圖啓用&禁用該控件從javascript/jQuery對複選框控制。如何獲取Listbox控件的選定項目?

我的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 + "')"); 
    } 
} 

使用上面的代碼我能夠啓用/禁用列表框控件。但是,當我啓用控件並選擇多個項目並提交表單時,我無法找到列表框的選定項目

如何獲取選定的Listbox項目?或者是否有任何其他方式來啓用 - 禁用列表框控件,並獲取在C#代碼中選擇的項目?

+1

我的猜測是ASP.NET會忽略它,因爲它被禁用了。在客戶端更改它可能爲時已晚,因爲框架已經決定將它從視圖狀態中分離。如果不禁用它,會發生什麼控件標記,而是在d時立即在JavaScript中禁用它禮物呈現?然後在JavaScript中根據需要繼續啓用/禁用。從服務器的角度來看,它會「期待」它被啓用,並會像其他控件一樣跟蹤它。 – David 2013-02-09 13:37:31

+0

@David你能解釋一些代碼嗎?如果我必須在頁面加載時執行此操作,則不存在任何問題。我的目標是啓用 - 禁用該控件。 – 2013-02-09 13:39:18

回答

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)的角度來保持控件的啓用,並且在UI中完全在客戶端(JavaScript)一側維護啓用/禁用。從本質上刪除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事件,因爲該方法ISN對我來說特別直觀。 (它混合了JavaScript和C#,這讓人感覺有點落後了。)所以我不是完全確定你要採取的方法。

實質上,您希望爲控件的每個實例調用JavaScript的這兩行代碼,並且希望在頁面加載到瀏覽器時立即執行它。

在jQuery中我會做這樣的事情:

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

的DOM加載時這將運行,並會添加disabled屬性(與"disabled"select與類ddl

相關問題