2015-01-15 2 views
-1

Visual Studio 확장 프로그램에서 작업하고 현재 목표는 도구 메뉴에서 메뉴 항목을 설정하는 것입니다. 이 메뉴 항목을 클릭하면 ListView, 3 개의 텍스트 상자 및 버튼이 포함 된 WinForms 창이 열립니다. 생각하면 ListView에서 행 중 하나를 클릭하면 해당 행의 데이터가 텍스트 상자에 채워져 업데이트 할 수 있습니다. 단추를 클릭하면 새 행이 추가되고 텍스트 상자가 지워집니다. 그러나 내가 선택한 행의 색인을 가져 오는 데 문제가 있습니다.속성이 설정된 값과 다른 값을 반환합니다.

private int _index; 

private void newSourceBtn_Click(object sender, EventArgs e) 
{ 
    // Add new row to the ListView 
    ListViewItem row = new ListViewItem(); 
    row.SubItems.Add("new"); 
    row.SubItems.Add(String.Empty); 
    row.SubItems.Add(String.Empty); 

    remoteSourceListView.Items.Add(row); 
    int index = remoteSourceListView.Items.Count - 1; 
    remoteSourceListView.Items[index].Selected = true; 

    newSourceAdded = true; 
    sourceNameTextBox.Clear(); 
    sourceUrlTextBox.Clear(); 
} 

public void SourceName_TextChanged(object sender, EventArgs e) 
{ 
    remoteSourceListView.Items[IndexSelected].SubItems[1].Text = sourceNameTextBox.Text; 
} 

public void SourceURL_TextChanged(object sender, EventArgs e) 
{ 
    string url = sourceUrlTextBox.Text; 
    if ((url.StartsWith("http")) || (url.StartsWith("https")) || (url.StartsWith("git"))) 
    { 
     sourceBranchTextBox.Enabled = true; 
    } 

    remoteSourceListView.Items[IndexSelected].SubItems[2].Text = url; 
} 

public void SourceBranch_TextChanged(object sender, EventArgs e) 
{ 

} 

public void SourcesListView_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    ListView.SelectedListViewItemCollection selectedRows = remoteSourceListView.SelectedItems; 

    foreach (ListViewItem row in selectedRows) 
    { 
     sourceNameTextBox.Text = row.SubItems[1].Text; 
     sourceUrlTextBox.Text = row.SubItems[2].Text; 

     IndexSelected = row.Index; 

     if (row.SubItems[3].Text != "") 
     { 
      sourceBranchTextBox.Enabled = true; 
      sourceBranchTextBox.Text = row.SubItems[3].Text; 
     } 
    } 
} 

public int IndexSelected 
{ 
    get { return _index; } 
    set { _index = value; } 
} 

이 코드리스트 뷰에 새 행을 추가 버튼 클릭 이벤트는, 텍스트리스트 뷰 (그렇다고)에 행을 업데이트하는 텍스트 상자의 각 변경 이벤트를 표시하고 선택한 인덱스에 대한 이벤트를 변경 방금 선택한 행의 인덱스를 가져 오는 ListView입니다. 디버깅하는 동안, 나는 행을 클릭 할 때 선택된 인덱스가 바뀐 이벤트에서 올바른 인덱스를 얻는다는 것을 알아 차렸다. 그러나 텍스트 변경 이벤트 중 하나에서 IndexSelected를 호출하면 항상 다른 인덱스가 제공됩니다.

제안 사항?

답변

2

게시 된 코드에서 문서화 된 동작을 설명하는 이유를 찾을 수 없습니다.
저장된 RowIndex 앞에 위치에 새/기존 ListViewItem을 삽입/삭제하는 이유가있을 수 있습니다.

그러나 다른 방법이 가능합니다. RowIndex를 유지하는 대신 선택한 ListViewItem에 전역 속성을 설정하고 하위 항목을 설정해야 할 때이 인스턴스를 다시 사용할 수 있습니다.

이렇게하면 저장된 RowIndex 앞에 ListViewItems 수가 변경되고 일부 항목이 삽입/제거되는 경우 문제를 방지 할 수 있습니다. 그러나 null 값에 대한 보호 장치가 제공되어야합니다.

private ListViewItem CurrentItemSelected {get;set;} 
...... 

public void SourcesListView_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    ListView.SelectedListViewItemCollection selectedRows = remoteSourceListView.SelectedItems; 

    foreach (ListViewItem row in selectedRows) 
    { 
     sourceNameTextBox.Text = row.SubItems[1].Text; 
     sourceUrlTextBox.Text = row.SubItems[2].Text; 

     CurrentItemSelected = row; 

     if (row.SubItems[3].Text != "") 
     { 
      sourceBranchTextBox.Enabled = true; 
      sourceBranchTextBox.Text = row.SubItems[3].Text; 
     } 
    } 
} 

public void SourceName_TextChanged(object sender, EventArgs e) 
{ 
    if(CurrentItemSelected != null) 
     CurrentItemSelected.SubItems[1].Text = sourceNameTextBox.Text; 
} 

그러나 귀하의 코드에 난처합니다. 속성 MultiSelect을 true로 설정 했습니까? false로 설정하면 코드가 반복 할 필요가 없기 때문입니다.

public void SourcesListView_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    if(remoteSourceListView.SelectedItems.Count > 0) 
    { 
     // With MultiSelect = false; there is only one selected item. 
     CurrentItemSelected = remoteSourceListView.SelectedItems[0]; 
     sourceNameTextBox.Text = CurrentItemSelected.SubItems[1].Text; 
     sourceUrlTextBox.Text = CurrentItemSelected.SubItems[2].Text; 
     if (CurrentItemSelected.SubItems[3].Text != "") 
     { 
      sourceBranchTextBox.Enabled = true; 
      sourceBranchTextBox.Text = CurrentItemSelected.SubItems[3].Text; 
     } 
    } 
} 
+0

감사합니다. 솔루션이 완벽하게 작동했습니다. 내가 어떻게 든 저장된 RowIndex 전에 행을 추가하는 것 같아요. – tylerbhughes

관련 문제