2017-04-11 61 views
0

我試圖在點擊我的按鈕時得到一個id。我的按鈕裏面一個GridViewAsp:帶有CommandArgument的GridView按鈕

<asp:GridView runat="server" AutoGenerateColumns="false" 
          ID="UsersGridView" AllowPaging="true" 
          CssClass="table table-hover table-striped" 
          UseAccessibleHeader="true" GridLines="None"> 
        <Columns> 
         <asp:BoundField DataField="User.FullName" HeaderText="User" /> 
         <asp:BoundField DataField="Book.Title" HeaderText="Book" /> 
         <asp:BoundField DataField="BooksReserved.DateOut" HeaderText="Return Date" 
          FooterStyle-BackColor="#ff0000" DataFormatString="{0:d}" /> 
         <asp:TemplateField ShowHeader="false"> 
          <ItemTemplate> 
           <asp:LinkButton ID="userProfile" runat="server" OnCommand="userProfile_Command" 
            CommandArgument='<% Eval("User.Id") %>' 
            Text="Open User Profile" CssClass="btn btn-success" /> 
          </ItemTemplate> 
         </asp:TemplateField> 
        </Columns> 
       </asp:GridView> 

在後面方法Page_Load中的代碼,我從3個表加載我的gridview的數據:

protected void Page_Load(object sender, EventArgs e) 
{ 
    // Users Grid 
    var query = from u in db.Users 
       join br in db.BooksReserveds on u.Id equals br.UserId 
       join b in db.Books on br.BookId equals b.Id 
       where br.DateOut < DateTime.Today 
       orderby br.DateOut 
       select new { User = u, BooksReserved = br, Book = b }; 

    UsersGridView.DataSource = query.ToList(); 
    UsersGridView.DataBind(); } 

而在按鈕的點擊,我試圖讓該ID:

protected void userProfile_Command(object sender, CommandEventArgs e) 
{ 
    try 
    { 
     int id = Int32.Parse(e.CommandArgument.ToString()); 
     var query = from u in db.Users 
        where u.Id == id 
        select u; 
    } catch(Exception any) 
    { 
     Console.WriteLine(any.ToString()); 
    } 
} 

我收到異常:「輸入字符串不是正確的格式。」

有誰知道爲什麼?

感謝

+0

您可以渲染只是'<%Eval(「User.Id」)%>'來查看輸出是否顯示整數值嗎? – Win

+0

它給我一個語法錯誤。預期a; – user6824563

回答

3

你忘了#。語法應爲<%# %>

<asp:LinkButton ID="userProfile" runat="server" OnCommand="userProfile_Command" 
    CommandArgument='<%# Eval("User.Id") %>' 
    Text="Open User Profile" CssClass="btn btn-success" /> 
+0

當我開始輸入我的答案時,這個答案不在這裏。這很簡單。 – JustSomeDude

1

在這裏,你正在做select new到您的query變量您Page_Load事件處理程序,使該變量的匿名對象:

// Users Grid 
//by using var here and select new this object is anonymous. 
var query = from u in db.Users 
      join br in db.BooksReserveds on u.Id equals br.UserId 
      join b in db.Books on br.BookId equals b.Id 
      where br.DateOut < DateTime.Today 
      orderby br.DateOut 
      select new { User = u, BooksReserved = br, Book = b }; 

UsersGridView.DataSource = query.ToList(); 
UsersGridView.DataBind(); 

你需要一個定義的對象,你可以轉換爲在GridView的ItemTemplate中。事情是這樣的:

public class UserGridViewModel 
{ 
    public User User { get; set; } 
    public BooksReserved BooksReserved { get; set; } //sounds like it could be a collection, but I do not know. 
    public Book Book { get; set; } 
} 

然後,回到你Page_Load UserGrid選擇查詢:

// Users Grid -- Notice the select new UserGridViewModel() 
var query = from u in db.Users 
     join br in db.BooksReserveds on u.Id equals br.UserId 
     join b in db.Books on br.BookId equals b.Id 
     where br.DateOut < DateTime.Today 
     orderby br.DateOut 
     select new UserGridViewModel() { User = u, BooksReserved = br, Book = b }; 

然後在你的Gridviw,ItemTemplate中基本上是一個命名容器和該容器,你需要得到的DataItem ,這將是一個UserGridViewModel對象(您必須將dataItem轉換爲您的模型)。看到的只是你的命令參數的這段代碼(也注意到這個服務器開放踏歌<%#):

CommandArgument='<%# ((UserGridViewModel)Container.DataItem).User.Id %>' 

從UserGridViewModel任何其他變量可以以類似的方式來訪問ItemTemplate模板內。