2011-08-18 1 views
2

나는 Grid View의 각 행에 Date Textbox가 있습니다. 사용자가 텍스트 상자에 값을 입력 할 수 없도록해야하므로이 속성을 ReadOnly = "true"로 설정했습니다. 그리고 Textbox 값을 설정하는 캘린더 자바 스크립트 플러그인을 제공했습니다. 이제 저장 클릭시 날짜 텍스트 상자에 액세스하려고하면 텍스트 상자 값이 유지되지 않습니다.클라이언트 쪽 스크립트를 통해 변경할 때 서버 쪽의 Readonly Textbox 값에 액세스하는 방법

이 문제와 해결책에 대해서도 알고있었습니다. 이 문제를 해결하려면 서버 측에 readonly 속성을 설정해야합니다. 하지만 여기서 가장 큰 관심사는 그리드보기의 템플릿 필드 안에 텍스트 상자를 놓았습니다. 그래서 격자보기의 각 행을 반복 한 다음 날짜 텍스트 상자에 대한 참조를 가져온 다음 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

주위에 또 다른 멋진 일이있어. 은 ASP 텍스트 상자를 HTML 입력 유형 텍스트로 바꾸고 runat = "server"속성을 추가하고 readonly 속성을 추가합니다. 서버 측에

<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

코드 솔루션은 코드 숨김에서 속성을 설정하는 것입니다. 단지 RowCreated-이벤트에 그것을 할, 당신은의 GridView를 통해 루프가없는

(this question 참조)

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");

관련 문제