asp.net
  • data-binding
  • gridview
  • 2011-08-11 15 views 4 likes 
    4

    我有一個GridView綁定到某個實體數據源。編輯已啓用。 GridView中顯示的實體與另一個實體關聯。假設我正在顯示Machines,它們正在創建Products(每臺機器無一個或一個產品類型)。我在gridview中顯示產品的名稱與如何在EditItemTemplate中使用Bind()爲空屬性?

    <ItemTemplate> 
        <asp:Label ID="Label1" runat="server" 
         Text='<%# ((Machine)Container.DataItem).Product == null ? "-" : ((Machine)Container.DataItem).Product.Name %>'> 
        </asp:Label> 
    </ItemTemplate> 
    

    它運作良好。現在我想要編輯EditItemTemplate中的相關產品。所以我添加

    <EditItemTemplate> 
        <asp:DropDownList runat="server" ID="ddProducts" DataSourceID="dsProducts" 
          DataTextField="Name" DataValueField="ProductID" 
          SelectedValue='<%# Bind("Product.ProductID") %>' 
          AppendDataBoundItems="true"> 
          <asp:ListItem Text="" Value="0"></asp:ListItem> 
        </asp:DropDownList> 
    </EditItemTemplate> 
    

    它不工作,因爲當機器沒有相關的產品沒有匹配SelectedValue反正Productnull。我將空項目添加到DropDownList,當機器沒有產品時應該選擇它。而且,如果我編輯帶有產品的機器並選擇此項目,則應該刪除列。

    我該如何做到這一點?

    回答

    3

    我現在的工作。 GridView自動將空值轉換爲空字符串,所以問題不在綁定中,而是與我爲空值添加的特殊項目相關聯。

    更改

    <asp:ListItem Text="" Value="0"></asp:ListItem> 
    

    <asp:ListItem Text="" Value=""></asp:ListItem> 
    

    解決了這個問題瞬間......

    +0

    請標記爲答案,如果這解決了您的問題。您可以標記爲您自己的答案。 – naveen

    +0

    我還不能做到這一點。24小時或48小時需要通過,我不記得確切。 – Episodex

    +0

    好。 – naveen

    1

    您可以使用GridView's events,如RowDataBoundRowEditing。其中一個方法是:

    private void GridView_RowEditing(object sender, GridViewEditEventArgs e) 
        { 
         int index = e.NewEditIndex; 
         GridView1.EditIndex = index; 
         DropdownList ddrList = Gridview1.Rows[index].FindControl("ddProducts") as DropDownList; 
         DataRowView view = (DataRowView)GridView1.Rows[index].DataItem; 
         if(!ddrList.FindItemByValue(view.Row["Product.ProductID"].ToString().Equals(String.Empty)) 
          ddrList.FindItemByValue(view.Row["Product.ProductID"].ToString()).Selected = true; 
        } 
    
    +0

    不幸的是貌似'ddrList'和'view'都是空值。你確定它應該工作嗎? – Episodex

    0

    給這一個鏡頭:

    SelectedValue='<%# Eval("Product.ProductID") != null ? Bind("Product.ProductID") : 0 %>' 
    

    顯然,無論你想更換0。

    +0

    'Eval()'只用於顯示數據,據我所知。這裏主要關心的是將價值存回數據庫。 – Episodex

    +0

    剛編輯我的答案。我改變了使用綁定而不是Eval的真實案例 - 我認爲現在應該可以工作。 –

    +0

    不幸的是:'名字'綁定'在當前的情況下不存在' – Episodex

    0

    好,給這一個鏡頭:

    SelectedValue='<%# CheckIfValueIsNull(Bind("Product.ProductID"), 0).ToString() %>' 
    

    在代碼中添加一個功能後面處理的DBNull:

    protected object CheckIfValueIsNull(object value, object nullValue) 
    { 
        return value != DBNull.Value ? value : nullValue; 
    } 
    
    +0

    同樣的錯誤,這很奇怪......但無論如何,我認爲以這種方式綁定它將嘗試更改產品的ID而不是更改Machine中的產品ID。也許我應該嘗試綁定到ProductID列,但我沒有映射此屬性... – Episodex

    +0

    是否有可能修改產品對象,使其返回-1而不是null?這樣,你可以添加一個ListItem到值爲「-1」的下拉列表中。 –

    +0

    我錯了改變ID。它綁定了它,當我做'SelectedValue ='<%#綁定(「產品。ProductID「)%>''但是這個課程只有在有機器產品的時候才起作用 – Episodex

    相關問題