2009-12-02 44 views
5

Tôi có một GridView quy định như sau:Nhận Hidden Giá trị trường

<asp:GridView ID="myGridView" AutoGenerateColumns="false" runat="server" 
OnLoad="myGridView_Load" OnRowCommand="myGridView_Command" OnRowEditing="myGridView_RowEditing" OnRowDeleting="myGridView_RowDeleting" DataKeyNames="ID" > 
    <Columns> 
    <asp:BoundField DataField="ID" Visible="false" /> 
    <asp:BoundField DataField="BirthDate" Visible="false" /> 
    <asp:BoundField DataField="FirstName" HeaderText="First Name" /> 
    <asp:BoundField DataField="LastName" HeaderText="Last Name" /> 
    <asp:TemplateField HeaderText="Other"> 
     <ItemTemplate> 
     <asp:LinkButton ID="editLB" runat="server" Text="edit" CommandName="Edit" /> 
     <asp:LinkButton ID="deleteLB" runat="server" Text="delete" CommandName="Delete" /> 
     </ItemTemplate> 
    </asp:TemplateField> 
    </Columns> 
</asp:GridView> 

Khi người dùng nhấp vào nút chỉnh sửa, tôi cần để có được giá trị của cột BirthDate. Để thực hiện điều này, tôi đã thử các cách sau:

protected void myGridView_RowEditing(object sender, GridViewEditEventArgs e) 
{ 
    GridViewRow row = gvUsers.Rows[e.NewEditIndex]; 
    DateTime birthDate = (DateTime)(row.Cells[1].Text); 

    // Does not work 
} 

Tôi biết nó có liên quan đến việc cột không hiển thị. Cột phải được ẩn. Nhưng tôi cần phải nhận được giá trị đó — làm cách nào tôi có thể thực hiện việc này?

Trả lời

9

Vấn đề là khi thuộc tính Visibility của BoundField được đặt thành sai cột không được hiển thị cho khách hàng. Thay vào đó, công việc sẽ sử dụng một sốtrong một số TemplateField.

<asp:TemplateField> 
    <ItemTemplate> 
     <asp:HiddenField ID="HiddenField1" runat="server" 
         Value='<%# Eval("BirthDate") %>' /> 
    </ItemTemplate> 
    <EditItemTemplate> 
     <asp:HiddenField ID="HiddenField1" runat="server" 
         Value='<%# Eval("BirthDate") %>' /> 
    </EditItemTemplate> 
</asp:TemplateField> 
protected void GridView_RowEditing(object sender, GridViewEditEventArgs e) 
{ 
    GridViewRow row = GridView.Rows[e.NewEditIndex];  
    HiddenField hidden = (HiddenField)row.Cells[0].FindControl("HiddenField1"); 
    DateTime birthDate = Convert.ToDateTime(hidden.Value); 
} 

EDIT

Các phương pháp trên vẫn ám chỉ rằng cột trong bảng, do đó bạn kết thúc với một cột trống. Nó hoạt động nhưng không phải là giải pháp tốt nhất, đây là cách ẩn trường Ngày sinh nhưng vẫn nhận được giá trị của nó trong trình xử lý sự kiện RowEditing. Chỉ cần nhớ rằng ngày sinh vẫn được hiển thị cho khách hàng, không được hiển thị.

<style type="text/css"> 
    .hide 
    { 
     display:none; 
    } 
</style> 

<asp:BoundField DataField="BirthDate"> 
    <ItemStyle CssClass="hide"/> 
</asp:BoundField> 
protected void GridView_RowEditing(object sender, GridViewEditEventArgs e) 
{ 
    GridViewRow row = GridView1.Rows[e.NewEditIndex]; 
    DateTime birthDate = Convert.ToDateTime(row.Cells[1].Text); 
} 
+0

tôi đã cố gắng thứ hai nhưng nó hided chỉ các giá trị và tiêu đề vẫn còn tồn tại. làm thế nào tôi có thể ẩn cũng tiêu đề? (Tôi không thể sử dụng hiển thị = false vì tôi neet dữ liệu của nó) – Rapunzo

+0

đặt lớp css tiêu đề để ẩn – MattBH

0

đây là một cách để có được dữ liệu từ dữ liệu cơ bản

protected void myGridView_RowEditing(object sender, GridViewEditEventArgs e) 
{ 
    GridViewRow row = gvUsers.Rows[e.NewEditIndex]; 
DateTime birthDate = Convert.ToDateTime(DataBinder.Eval(row.DataItem, "BirthDate")); 
} 
+0

Tôi không nghĩ DataItem được điền bên ngoài ngữ cảnh ràng buộc dữ liệu. Bên trong của trình xử lý sự kiện RowEditing, DataItem sẽ là rỗng. – Phaedrus

2

Tôi đã làm một cái gì đó như thế này (thích nghi với ví dụ của bạn):

string[] keyList = new string[1]; 
keyList[0] = "BirthDate"; 
myGridView.DataKeyNames = keyList; 

sau đó tôi bị ràng buộc GridView với một DataTable có một cột có tên là "Ngày sinh". Dữ liệu trong cột này sẽ được lưu trữ trong DataKeyName được chỉ định ở trên.

Để có được giá trị mong muốn, tôi sẽ làm một cái gì đó như thế này:

protected void myGridView_RowEditing(object sender, GridViewEditEventArgs e) 
{ 
    DataKeyArray keyList = myGridView.DataKeys as DataKeyArray; 
    if (keyList != null)  
    DateTime birthDate = keyList[e.NewEditIndex];  
} 

tôi nhận ra rằng đây không liên quan đến lĩnh vực tiềm ẩn, tuy nhiên.

+1

Thuộc tính DataKeyNames được sử dụng để nhận dạng duy nhất mỗi hàng, nó sẽ được sử dụng cho các khóa chính. – Phaedrus

+0

Điểm tuyệt vời. Khi tôi sử dụng DataKeyNames đó là chính xác những gì tôi sử dụng chúng cho. –

0

Tôi sẽ sử dụng đề xuất trường ẩn mà Phaedrus đề xuất và sau đó trong mã của bạn phía sau; sử dụng một cái gì đó như thế này:

GridViewRow row = gvUsers.Rows[e.NewEditIndex]; 
var hfBirthDate = (HiddenField)row.FindControl("hfBirthDate"); 
DateTime birthDate = DateTime.Parse(hfBirthDate.Value); 
5

Để ẩn nội dung cũng như Tiêu đề trong lưới, hãy sử dụng mã bên dưới: và truy cập cột như bình thường.GridView.SelectedRow.Cells[index].Text;

<style type="text/css"> 
.hide 
{ 
    display:none; 
} 

<asp:BoundField DataField="MailRoomID" HeaderText="Mailroom ID" ItemStyle-HorizontalAlign="Center" ShowHeader="false" ><ItemStyle CssClass="hide" /><HeaderStyle CssClass="hide"/></asp:BoundField> 
Các vấn đề liên quan