2013-05-15 3 views
0

ListView을 새 WPF 창에 만들고 ListView를 호출 할 때 ListView를 채우는 함수도 작성했습니다. 이 함수는 데이터를 저장 한 웹 서버의 URL을 가져 와서 "id"를 증가시키고 데이터를 가져 와서 ListView에 저장합니다. 따라서 ListView를 특정 수의 항목으로 채 웁니다.프로그래밍 방식으로로드 할 때 각 행에 두 개의 단추 추가

내가 직면 한 문제는 프로그래밍 방식으로 채워지는대로 각 ListView 항목에 ON & OFF라는 두 개의 단추를 추가하려고한다는 것입니다. 즉, 16 개의 항목이 추가되면 각 항목에 2 개의 버튼이 필요하고 12 개의 항목 인 경우 비슷한 절차가 필요합니다.

namespace user_login 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 

    public partial class MainWindow : Window 
    { 
     Window1 W = new Window1(); 

     public MainWindow() 
     { 
      InitializeComponent();  
     } 

     public void populate() 
     { 
      int i; 
      int num = 16; 

      for (i = 1; i <= num; i++) 
      { 
       string val = Convert.ToString(i); 
       string currentUrl = "http://xpleria.com/devices.php?query=dev&id="; 
       string newUrlWithChangedSort = ReplaceQueryStringParam(currentUrl, "id", val); 
       string result = getcontent(newUrlWithChangedSort);  
       W.list1.Items.Add(result); 
      } 
     } 

     public string getcontent(string URL) 
     { 
      string content = ""; 

      // Get HTML data 
      WebClient client = new WebClient(); 

      try 
      { 
       content = client.DownloadString(URL); 
      } 
      catch (Exception) 
      { 
       System.Windows.Forms.MessageBox.Show("No Connection detected!!!"); 
      } 
      return content; 
     } 

     public static string ReplaceQueryStringParam(string currentPageUrl, string paramToReplace, string newValue) 
     { 
      string urlWithoutQuery = currentPageUrl.IndexOf('?') >= 0 
       ? currentPageUrl.Substring(0, currentPageUrl.IndexOf('?')) 
       : currentPageUrl; 

      string queryString = currentPageUrl.IndexOf('?') >= 0 
       ? currentPageUrl.Substring(currentPageUrl.IndexOf('?')) 
       : null; 

      var queryParamList = queryString != null 
       ? HttpUtility.ParseQueryString(queryString) 
       : HttpUtility.ParseQueryString(string.Empty); 

      if (queryParamList[paramToReplace] != null) 
      { 
       queryParamList[paramToReplace] = newValue; 
      } 
      else 
      { 
       queryParamList.Add(paramToReplace, newValue); 
      } 

      return String.Format("{0}?{1}", urlWithoutQuery, queryParamList); 
     } 

     private void Button_Click_1(object sender, RoutedEventArgs e) 
     { 
      string user = textbox1.Text; 
      string password = textbox2.Password; 
      string currentUrl = "http://xpleria.com/login.php?query=login&user=wcam&pass=wireless"; 
      string newUrlWithChangedSort = ReplaceQueryStringParam(currentUrl, "user", user); 
      string newUrl = newUrlWithChangedSort; 
      string FinalUrl = ReplaceQueryStringParam(newUrl, "pass", password); 
      string result= getcontent(FinalUrl); 
      string value = result.Substring(0, 8); 

      string invalid = "xpleria0"; 
      string valid = "xpleria1"; 

      if (value.Equals(invalid)) 
      { 
       System.Windows.MessageBox.Show("The Username and/or Password you have entered is invalid, please try again"); 
      } 
      else if (value.Equals(valid)) 
      { 
       string sessionID = result.Substring(8, 32); 
       System.Windows.MessageBox.Show("HI, WELCOME CLETA"); 
       this.Close(); 

       using (new user_login.loading.PleaseWait(this.Location)) 
       { 
        W.Show(); 
        populate(); 
       } 
      } 
     } 

     public System.Drawing.Point Location { get; set; } 
    } 
} 
+0

'ListViewItem'을 원하는 방식으로 보여주는'ListView'에 대해'DataTemplate'을 만들려고 했습니까? – nakiya

답변

1

난 당신이 단계를 다시 받아와 코드를 조직에 심각한 고려하여 시작하는 것이 좋습니다거야 : 여기에 내 코드입니다. 이 질문에 대한 대답이 아니라는 것을 깨닫지 만 질문에 대한 대답입니다.

먼저 URL에서 이러한 항목을 가져 오는 것과 관련된 모든 코드를 일종의 클래스로 옮겨야합니다. 이 클래스는 URL 문자열을 생성자 매개 변수로 받아 들여 모든 적절한 데이터를 수집해야합니다. 그런 다음 각 개별 항목에 대한 데이터를 채우고이 목록을 노출하는 데 사용할 다른 클래스를 만들어야합니다. 작업이 끝나면 윈도우의 코드는 다음과 같이 조금 복잡해집니다.

var ItemsGetter = new ItemsGetter(URL); 
foreach(var Item in ItemsGetter.Items) 
{ 
    // Populate the ListView 
} 

이렇게하면 UserControl을 만드는 것이 좋습니다. 사용자 컨트롤은 각각의 컨트롤에서 각각의 작업을 수행 할 수있는 고유 한 컨트롤 집합을 사용하여 동적 데이터 항목을 동적으로 표현해야하는 상황에서 매우 유용합니다. 레이블과 필요한 두 개의 단추가있는 UserControl을 만들어야합니다. UserControl의 생성자는 각 클래스를 나타 내기 위해 만든 데이터 형식의 매개 변수를 필요로합니다. 거기에서 필요에 따라 버튼을 데이터 유형에 대해 조작 할 수 있습니다.

마지막으로 UserControl이 Window와 상호 작용할 수있는 방법이 필요합니다. 예를 들어 버튼 중 하나가 "삭제"라고 말하십시오. 작업이 완료되면 목록에서 해당 항목을 사라지게 할 수 있습니다. 매개 변수 또는 뭔가로 전달하여 창 제어에 묶여 유혹하지 마십시오. 대신 Action 이벤트를 읽고 목록보기를 채울 때 Window의 foreach 루프에서 바인딩하는 사용자 정의 컨트롤에서 이벤트를 만드는 방법을 배웁니다. UserControl이 버튼에 의해 트리거 된 삭제 작업을 완료하면 List View에서 컨트롤을 제거하도록 Window에 프롬프트를 표시하는 UserControl의 이벤트를 발생시킬 수 있습니다.

마지막으로 중요한 것은 입니다. 귀하의 컴퓨터 이름은입니다.

이 정보가 도움이되기를 바랍니다.

+0

* 마지막으로 중요한 것은 귀하의 통제 이름입니다. * - 왜 그렇게해야합니까? 내가 할 수있을 때마다 이름을 지정하지 않도록 노력하고 있습니다. 그러나 아마도이 접근법을 재고하기위한 몇 가지 주장을 제시 할 수 있습니다. – DHN

+1

@DHN - 더 의미가있는 :'string user = textbox1.Text;'또는'string user = txtUsername.Text;'? –

+0

어느 쪽도 아니고 코드 숨김 컨트롤에 액세스하지 않으므로 이름이 필요하지 않습니다. ; o) - 농담은 제쳐두고, 당신 말이 맞아. Codebehind에서 컨트롤에 액세스해야하는 경우 읽을 수있는 이름을 사용하는 것이 좋습니다. – DHN

관련 문제