2011-08-18 48 views
2

我在Grid View的每一行中都有一個日期文本框。由於不允許用戶在文本框中輸入自己的值,因此我們將該屬性設置爲ReadOnly =「true」。並提供了一個設置文本框值的日曆java腳本插件。現在,當我嘗試在保存點擊時訪問日期文本框時,文本框值不會被保留。通過客戶端腳本更改服務器端訪問Readonly文本框的變通辦法

我也知道這個問題和解決方案。我們需要在服務器端設置readonly屬性來解決這個問題。但我最關心的是,我已將文本框放在網格視圖的模板字段中。所以我需要遍歷Grid view的每一行,然後獲取日期文本框的引用,然後將readonly屬性設置爲只讀。看起來非常麻煩。任何人都可以提出其他選擇或解決辦法。

代碼如下

<asp:GridView ID="gv_sample" runat="server" AutoGenerateColumns="false"> 
<Columns> 
    <asp:TemplateField> 
    <ItemTemplate> 
     <table cellpadding="0" cellspacing="0" border="0"> 
     <tr> 
     <td> 
     <asp:TextBox runat="server" ID="txtByWhen" ReadOnly="true" CssClass="inputbox" Text='<%#Eval("ByWhen") %>'></asp:TextBox> 
     </td> 
     <td style="padding-left: 2px;"> 
     <img src="../Images/dateico.gif" alt="Select a date" title="Select a date" 
     onclick="JavaScript:return showCalendar('<%#((GridViewRow)Container).FindControl("txtByWhen").ClientID %>','dd/mm/y');" /> 
     </td> 
    </tr> 
    </table> 
    </ItemTemplate> 
    </asp:TemplateField> 
</Columns> 
</asp:GridView> 

回答

1

長出一圈另一個很酷的工作。只需用HTML輸入類型文本替換ASP文本框並添加runat =「server」屬性,進一步添加只讀屬性。示例代碼如下

<asp:GridView ID="gv_sample" runat="server" AutoGenerateColumns="false"> 
<Columns> 
    <asp:TemplateField> 
    <ItemTemplate> 
     <table cellpadding="0" cellspacing="0" border="0"> 
     <tr> 
     <td> 
     <input type="text" runat="server" id="txtByWhen" readonly="readonly" class="inputbox" 
     style="width: 50px;" value='<%#Eval("ByWhen") %>' /> 
     </td> 
     <td style="padding-left: 2px;"> 
     <img src="../Images/dateico.gif" alt="Select a date" title="Select a date" 
     onclick="JavaScript:return showCalendar('<%#((GridViewRow)Container).FindControl("txtByWhen").ClientID %>','dd/mm/y');" /> 
     </td> 
    </tr> 
    </table> 
    </ItemTemplate> 
    </asp:TemplateField> 
</Columns> 
</asp:GridView> 

在服務器端,我們可以只添加以下代碼所獲得的價值

foreach (GridViewRow gvr in RSGV_ScoreCard.Rows) 
{ 
using (HtmlInputText txtByWhen = (HtmlInputText)gvr.FindControl(STR_BYWHEN)) 
    { 
    string date=txtByWhen.Value.Trim(); 
    } 
} 

希望這將節省編碼不少。

1

你是對的,解決的辦法是設置在代碼隱藏屬性。 (見this question

你不通過GridView必須循環,只是做在RowCreated-事件:

protected void Page_Load(object sender, EventArgs e) 
{ 
    gv_sample.RowCreated += new GridViewRowEventHandler(gv_sample_RowCreated); 
} 

void gv_sample_RowCreated(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     TextBox txtByWhen = (TextBox)e.Row.FindControl("txtByWhen"); 
     txtByWhen.Attributes.Add("readonly", "readonly"); 
    } 
} 
+0

+1好好的。任何其他的工作? – suryakiran

0

最後這讓解決了我:)

我所做的是從文本框中刪除只讀屬性,並加入其中,我什麼都不是像下面返回ForceReadOnly類:

$.fn.ForceReadOnly = 
 
function() { 
 
    return this.each(function() { 
 
     $(this).keydown(function (e) { 
 
      var key = e.charCode || e.keyCode || 0; 
 
      return (key == 9); 
 
     }); 
 
    }); 
 
}; 
 

 

 
$(".ForceReadOnly").ForceReadOnly();

,所以我們得到了只讀從事件不是財產

0

儘量不要通過更改其屬性直接使文本框只讀。

取而代之的是,我們可以在代碼隱藏中添加以下代碼行,並使文本框只讀,但仍然可以通過回發保留其在客戶端的更改值。

TextBox1.Attributes.Add(「readonly」,「readonly」);

相關問題