2012-10-11 50 views
0

我的FormView中有一個用於我的FormView(Students)的ObjectDataSource和DropDownList(Name)的另一個ObjectDatSource。如果DropDownList的源不包含與formview的源相匹配的名稱值,我想顯示「不可用」。目前我有這個代碼,如果數據源返回一個NULL值,這個代碼就可以工作。如何在FormView名稱值不在DropDownList的數據綁定列表中時將其更改爲顯示「Not Available」?Formview - 檢查值是否在數據綁定列表中

<asp:FormView ID="Students" runat="server" DataSourceID="Students_DataSource"> 
    <ItemTemplate> 
     <asp:Label ID="lblName" runat="server" Text='<%# Eval("Name") %>' /> 
    </ItemTemplate> 
    <EditTemplate> 
     <asp:DropDownList ID="ddlName" runat="server" 
     SelectedValue='<%# If(Eval("Name") IsNot Nothing, Eval("Name"), "Not Available") %>' 
        DataSourceID="fvAllNames" runat="server" DataTextField="Name" DataValueField="Name" />   
    </EditTemplate> 
</asp:FormView> 
+0

我正在使用一個數據庫,在我的示例中,Student表中有很多來自過去的錯誤條目,需要很長時間才能返回並修復/正確綁定到Names表。名稱表是新的,並且具有精確的學生姓名的良好列表。因此,在gridview中的這個檢查將會捕獲Student表中的任何條目,其中可能會輸入名稱以及額外的空格等,這些名稱與Names表不匹配。對不起,如果這仍然令人困惑... – user1620141

+0

我通常不使用數據源控件。我傾向於傾向於創建從數據庫構建的自定義對象,並使用代碼進行處理。我知道如果你是這樣設置的,你實際上可以查詢對象集合(數據庫結果集)並將它們與下拉的項目集合進行匹配並相應地操作它們。這是更多的代碼,但更靈活的imo。 – Sinaesthetic

+0

我是ASP.NET新手。你能給我一個如何實現這個目標的例子嗎? – user1620141

回答

0
public class MyItem 
{ 
    public string Name { get; set; } 
    public int UserId { get; set; } 
} 

public void MethodThatLoadsMyData 
{ 
    var originalListData = MethodThatFetchesMyData(45); 
    myDropDownList.DataSource = MethodThatBumpsTwoItemDatasources(myOuterList, originalListData); 
    myDropDownList.DataBind(); 
} 

public void MethodThatBumpsTwoItemDatasources(List<MyItem> outerList, List<MyItem> dropdownList) 
{ 
    /*This modifies the original result set from the database that you were going 
    to use to populate your dropdown list. It compares the outer list (whatever that is) 
    with the result set, and adds items called "Not Available" when there is an item in the 
    outer list that doesn't exist in the dropdownlist */ 

    var result = new List<Item>(); 
    foreach (var item in listA) 
    { 
     var matched = false; 
     foreach (var itemB in listB.Where(itemB => itemB.Id == item.Id)) 
     { 
      matched = true; 
      result.Add(item); 
     } 
     if (!matched) 
     { 
      result.Add(new Item 
      { 
       Name = "Not Available", 
       Id = 0 
      }); 
     } 
     matched = false; 
    } 
    return result; 
} 

public List<MyItem> MethodThatFetchesMyData(int myParameter) 
{ 
    //gets my data from the database and builds dto objects 
    var sql = "my_stored_procedure_or_sql"; 
    var list = new List<MyItems>(); 
    using(var conn = new SqlConnection(myConnectionString)) 
    { 
     using(var comm = new SqlCommand(sql, conn)) 
     { 
      //do your normal client setup here (sql type, parameters, etc// 
      var parameters = SqlParameter[1]; 
      parameters[0] = new SqlParameter("@ParameterName", DbType.Int); 
      parameters[0].Value = myParameter; 
      comm.Parameters = parameters; 
      comm.CommandType = CommandType.StoredProcedure; 
      conn.Open(); 
      using(var rdr = comm.ExecuteReader()) 
      { 
       while(rdr.Read()) 
       { 
        list.Add(
         new MyItem{ 
          Name = rdr["NameColumn"].ToString(), 
          UserId = rdr["ID"] 
         }); 
       } 
       return list; 
      } 
     } 
    } 
} 

在你的數據綁定控件,你可以在ItemTemplate新值獲得與典型的

<%#Eval("Name") %> <%#Eval("UserId") %> 

什麼我實際上在這裏做的控件綁定到列表實際對象而不是使用數據源控件構建的數據表。通過這樣做,我可以在將這些列表綁定到控件之前完成所需的任何操作。在這種情況下,我將兩個列表碰撞在一起,併爲那些不在一個列表中但存在於另一個列表中的項目添加項目。不知道這是否正是你需要的,但這應該足以給你一些想法。