2009-07-17 2 views
1

TextBox에 Button과 Datagrid가있는 페이지가 있습니다.datagrid datasource에 항목을 추가하여 viewstate를 잃습니다.

목표는 간단합니다. TextBox에 내용을 입력하고 Button을 누를 때마다 약간의 확인을 한 다음 항목을 DataGrid 및 비즈니스 논리 데이터 소스에 추가합니다.

문제는 내가 DataGrid에 항목을 표시하게하려면 datagrid.DataSource = myBusinessObject; datagrid.DataBind(); 문제는 내가 viewstate 및 사용자가 한 라디오 박스에서 선택을 잃게됩니다. 뒤에

  <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; } 
} 

그래서 내가 직접 질문을 것 같아요 그리드에 radioboxes의 선택을 잃지 않고 그리드 & 비즈니스 오브젝트에 항목을 추가하는 방법.

+0

사실 나는 datagrid.Datasource = "something"및 datagrid.DataBind(); 다시 게시 할 때 ...하지만 개체가이 방법으로 추가되지 않습니다 ... – Erick

답변

2

에 라디오 박스의 상태를 저장해야합니다.에 새 항목을 추가하면 다시 바인딩 할 때 선택 사항이 다시 DataGrid에 반영됩니다.
당신이 그 일을하는 경우, 당신은뿐만 아니라, 그리드에 대한 ViewState를 비활성화 할 수 있습니다 ...

+0

옙이 방법 = D 정확하게 작동하지 않지만 definetly 작동합니다. – Erick

0

귀하의 데이터 그리드의 특성 Test1을에 그 의 RadioButton를 결합, 그래서 당신은 그에 따라 그 설정하면, 선택된 선택을 유지하지 않아야합니다.

저는 ASP .NET 사용자가 아니기 때문에 나보다 똑똑한 사람이 도움이되기를 바랍니다.하지만 아무도 대답하지 않기를 바랍니다. 나는 그것을 줄 것이다. 라디오 버튼은 Test1.IsRegister 속성에 바인딩되어 있습니다. 즉, 상태를 유지하려면 해당 속성을 true 또는 false로 설정해야합니다. 먼저 문자열 대신 bool을 유지하도록 Test1 클래스를 변경합니다. 지금은 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; } } 
    } 

지금 당신은 누군가가 의 RadioButton에 누를 때마다 저장해야합니다, 당신은 이벤트 핸들러를 작성해야 true로 에게 AutoPostBack은을 설정합니다.

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

지금 이벤트 핸들러 을 register_checked. 이 부분은 RadioButton.Checked 속성의 값을 받아 목록의 항목으로 설정하는 부분입니다. 당신의 의 RadioButton의이 ItemTemplate을의 일부이며 잠재적으로 많은 DataGridItem이있을 것이라는 점을 의미 데이터 그리드, 결합되기 때문에

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; 
       } 
      } 

     } 

이 모든 작업을 수행해야하는 이유는 따라서 많은 id는 "register"인 RadioButton입니다. 이것이 코드 숨김에서 얻을 수없는 이유입니다.

RadioButton의 상태가 유지됩니다. 희망이 당신을 도와줍니다.

관련 문제