2013-06-12 1 views
1

간단한 설명 텍스트 열과 ImageUrl에 대한 열이있는 테이블에 데이터 바인딩되는 DropDownList가 있습니다. 사용자가 DropDownList에서 선택을 클릭하면 이미지가 div에 추가됩니다. 나는 DropDownList의 AutoPostBack 속성을 true로 설정하여 사용자가 페이지와 더 잘 상호 작용할 수 있도록했습니다. 처음에 나는 괜찮 았다고 생각했다. 그런 다음 사용자가 드롭 다운에서 항목을 추가하면 div에 추가 된 항목 ("추가 할 사진 선택")의 기본 텍스트로 돌아갑니다. 사라질 것입니다. 그런 다음 사용자가 추가 할 다른 그림을 선택하면 새 그림이 사라진 이전 그림과 함께 추가됩니다. 누군가가 내가 왜 그런지 알아낼 수 있습니까?div에서 컨트롤을 제거하는 DropDownList의 기본값

public partial class Webform1 : System.Web.UI.Page 
{ 
    string imageListKey = "imageListKey"; 
    //List of images inside the div will be stored in Viewstate to they aren't lost 
    //during postback 
    List<string> ImagePaths 
    { 
     get 
     { 
      if (ViewState[imageListKey] == null) 
       ViewState[imageListKey] = new List<string>(); 
      return (List<string>)ViewState[imageListKey]; 
     } 
    } 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     //don't hit the database every time there's a postback 
     string cs = ConfigurationManager.ConnectionStrings["dbcs"].ConnectionString; 
     if(!IsPostBack) 
     { 
      using (SqlConnection con = new SqlConnection(cs)) 
      { 
       using (SqlCommand cmd = new SqlCommand("select * from CardPictures", con)) 
       { 
        con.Open(); 
        cmd.CommandType = CommandType.Text; 
        DropDownList2.AutoPostBack = true; 
        DropDownList2.DataTextField = "SideAffectName"; 
        DropDownList2.DataValueField = "ImagePath"; 
        DropDownList2.DataSource = cmd.ExecuteReader(); 
        DropDownList2.DataBind(); 
        DropDownList2.Items.Insert(0, new ListItem("Select picture to add", "-1")); 
       } 
      } 
     } 
    } 
    protected void DropDownList2_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     //don't allow duplicate values in ImagePaths 
     if (!ImagePaths.Contains(DropDownList2.SelectedItem.Value)) 
     { 
      if (DropDownList2.SelectedItem.Value != "-1") 
      { 
       ImagePaths.Add(DropDownList2.SelectedItem.Value); 
       //foreach Image selected, add to testDiv 
       foreach (string s in ImagePaths) 
       { 
        testDiv.Controls.Add(AddImage(s)); 
       } 
      } 
     } 
    } 

    //to test that things are being added to the ViewState variable correctly 
    protected void Button1_Click(object sender, EventArgs e) 
    { 
     foreach (string s in ImagePaths) 
     { 
      Response.Write(s + "<br/>"); 
     } 
    } 
    //adds an Image and setes the imageUrl to whatever is in the ViewState ImagePaths 
    private Image AddImage(string imageUrl) 
    { 
     Image i = new Image(); 
     i.Height = 75; 
     i.Width = 75; 
     i.ImageUrl = imageUrl; 

     return i; 
    } 
} 

답변

1

귀하의 문제는의 SelectedIndexChanged 이벤트 처리기에 있습니다

protected void DropDownList2_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    //don't allow duplicate values in ImagePaths 
    if (!ImagePaths.Contains(DropDownList2.SelectedItem.Value)) 
    { 
     if (DropDownList2.SelectedItem.Value != "-1") 
     { 
      ImagePaths.Add(DropDownList2.SelectedItem.Value); 
      //foreach Image selected, add to testDiv 
      foreach (string s in ImagePaths) 
      { 
       testDiv.Controls.Add(AddImage(s)); 
      } 
     } 
    } 
} 

당신은 사용자 후비는/'추가 할 사진 선택'을 선택할 때의 포스트 백에 다시 testDiv UI 컨트롤에 항목을 추가하지 않는 (. 항목 아래 새로운 드롭을 선택하면이에만 발생

protected void DropDownList2_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    //don't allow duplicate values in ImagePaths 
    if (!ImagePaths.Contains(DropDownList2.SelectedItem.Value)) 
    { 
     if (DropDownList2.SelectedItem.Value != "-1") 
     { 
      // Only add to the image paths list if it is not 'Select picture to add' 
      ImagePaths.Add(DropDownList2.SelectedItem.Value); 
     } 
    } 

    // Always put the images into the DIV 
    //foreach Image selected, add to testDiv 
    foreach (string s in ImagePaths) 
    { 
     testDiv.Controls.Add(AddImage(s)); 
    } 
} 
+0

, 그것은 이동해야합니다 :이 (! DropDownList2.SelectedItem.Value = "-1")에 코드를이해야하는 경우의 내부 foreach 문이다 선택 이벤트가 발생했습니다. – fnostro

+0

@ 카를 감사합니다. – wootscootinboogie

1

컨트롤이 동적으로 만들어지고 어떤 상태에서도 저장되지 않습니다 (ViewState 또는 기타). 경로가 포함 된 문자열은 동적 이미지 컨트롤 자체는 아니지만 동적 이미지 컨트롤 자체는 아닙니다. 그래서 사용자가 -1의 값을 반환한다고 가정하는 프롬프트 텍스트를 선택하면 결코 다시 생성되지 않으므로 다시 게시 할 때 이미지 컨테이너를 다시 작성하지 마십시오.

어떻게해야합니까? 그것의 이미지 컨트롤 컨테이너 div는 자신의 메서드이고 페이지로드 중에 호출하므로 포스트 백이있을 때마다 렌더링되고 선택 이벤트가 발생하면 ImagePaths 컬렉션에만 문자열을 추가합니다.