2009-07-17 61 views
1

我有一個頁面有一個文本框一個按鈕和一個Datagrid。datagrid添加項到數據源失去視圖狀態

這裏的目標很簡單:每次我在TextBox中輸入一些內容並按下按鈕時,它會進行一些檢查,然後將該項添加到數據網格和業務邏輯數據源中。

問題是,如果我想使項目出現在DataGrid中,我必須做一個datagrid.DataSource = myBusinessObject; datagrid.DataBind();問題在於我失去了用戶已經完成的無線電框中的視圖狀態和選擇。

這裏是模板:

  <asp:TextBox ID="txtDomain" runat="server" style="margin-bottom: 0px" 
       Width="254px"></asp:TextBox> 
       &nbsp;<asp:Button ID="domainAdd" runat="server" onclick="domainAdd_Click" 
       style="height: 26px" Text="Ajouter" /> 
      &nbsp;<br /> 
      <br /> 
      <asp:DataGrid ID="dg1" runat="server" AutoGenerateColumns="false"> 
       <Columns> 
        <asp:BoundColumn DataField="Name" HeaderText="Nom choisi"></asp:BoundColumn> 
        <asp:TemplateColumn HeaderText="Enregistrer"> 
         <ItemTemplate> 
          <asp:RadioButton ID="register" runat="server" GroupName="domaine_action" Checked='<%# Bind("IsRegister")%>' Enabled='<%# Bind("CanRegister")%>' /> 
         </ItemTemplate> 
        </asp:TemplateColumn> 
        <asp:TemplateColumn HeaderText="Transférer"> 
         <ItemTemplate> 
          <asp:RadioButton ID="transfert" runat="server" GroupName="domaine_action" Checked='<%# Bind("IsTransfert")%>' Enabled='<%# Bind("CanTransfert")%>' /> 
         </ItemTemplate> 
        </asp:TemplateColumn> 
        <asp:TemplateColumn HeaderText="Gérer moi même"> 
         <ItemTemplate> 
          <asp:RadioButton ID="manage" runat="server" GroupName="domaine_action" Checked='<%# Bind("IsSelfManaged")%>' Enabled='<%# Bind("CanSelfManage")%>' /> 
         </ItemTemplate> 
        </asp:TemplateColumn> 
       </Columns> 
      </asp:DataGrid> 

的背後代碼:

protected void domainAdd_Click(object sender, EventArgs e) 
    { 
     if (Session["dic"] != null) 
     { 
      var _dic = (List<Test1>)Session["dic"]; 

      _dic.Add(new Test1 { Name = txtDomain.Text }); 

      dg1.DataSource = _dic; 
      dg1.DataBind(); 

      Session["dic"] = _dic; 
     } 
     else 
     { 
      List<Test1> _dic = new List<Test1>(); 

      _dic.Add(new Test1 { Name = txtDomain.Text }); 

      dg1.DataSource = _dic; 
      dg1.DataBind(); 

      Session["dic"] = _dic; 
     } 

對於現在的Test1的對象只是一個小映射類業務邏輯的領域。

public class Test1 
{ 
    public string Name { get; set; } 

    public string IsRegister { get; set; } 
    public string IsTransfert { get; set; } 
    public string IsSelfManaged { get; set; } 

    public string CanRegister { get; set; } 
    public string CanTransfert { get; set; } 
    public string CanSelfManage { get; set; } 
} 

所以我想直接的問題是:如何將項目添加到網格&業務對象沒有鬆動的選項框的選擇在網格中。

+0

其實我試過不做datagrid.Datasource =「something」和datagrid.DataBind();當有回傳...但對象不是以這種方式添加... – Erick 2009-07-17 15:05:22

回答

2

您將不得不在之前在之前添加一個新項List,以便當您再次綁定它時,這些選擇將反映回數據網格中。
如果你這樣做,你也可以禁用網格的ViewState ...

+0

是的這種方式= D 不完全乾淨,但作品definetly :) – Erick 2009-07-17 17:32:14

0

的DataGrid結合其單選到Test1的的性質,因此,如果您設置的相應的,如果它不保持選擇的選擇。

我不是一個ASP .NET的傢伙,我希望比我聰明的人能幫助你,但是因爲沒有人在回答。我會給它一個鏡頭。您的單選按鈕綁定到您的Test1.IsRegister屬性,這意味着要保持其狀態,您必須將該屬性設置爲true或false。首先改變你的Test1類來保存bool而不是字符串。現在我將CanRegister設置爲true,您可以稍後更改邏輯。

public class Test1 
    { 
     public string Name { get; set; } 

     public bool IsRegister { get; set; } 
     public bool IsTransfert { get; set; } 
     public bool IsSelfManaged { get; set; } 

     public bool CanRegister { get { return true; } } 
     public bool CanTransfert { get { return true; } } 
     public bool CanSelfManage { get { return true; } } 
    } 

現在你需要每個人壓在一個單選時間保存,你需要創建一個事件處理程序,並設置的AutoPostBack爲true。

<asp:RadioButton OnCheckedChanged="register_checked" AutoPostBack="true" ID="register" runat="server" GroupName="domaine_action" Checked='<%# Bind("IsRegister")%>' Enabled='<%# Bind("CanRegister")%>' /> 

現在事件處理register_checked。這是您將RadioButton.Checked屬性的值並將其設置爲您的列表中的項目的部分。

protected void register_checked(object sender, EventArgs e) 
     { 
      //make sure you have a list 
      if(Session["dic"] == null) 
       return; 

      List<Test1> _dic = (List<Test1>)Session["dic"]; 
      RadioButton btn = sender as RadioButton; 
      string btnClientId = btn.ClientID; 

      //make sure cast didnt crash 
      if (btn == null) 
       return; 

      foreach (DataGridItem control in dg1.Items) 
      { 
       //find the register RadioButton, ID="register" 
       var item = control.FindControl("register"); 
       //make sure its the right RadioButton 
       if (item.ClientID.Equals(btnClientId)) 
       { 
        //get the item index of this DataGridItem and take the appropriate object for List<Test1> 
        Test1 realItem = _dic[control.ItemIndex] as Test1; 
        if (realItem == null) 
         continue; 

        //set the Items IsRegister to the button value. 
        realItem.IsRegister = btn.Checked; 
       } 
      } 

     } 

你必須做這一切的原因是因爲你的單選 s爲一個的ItemTemplate的一部分,並綁定到DataGrid中,這意味着可能會有很多的DataGridItem因此很多RadioButton s具有相同的id「register」。這就是爲什麼你無法從代碼隱藏中獲得它的原因。

這將保留RadioButton s的狀態。希望這可以幫助你。