2013-08-10 4 views
1

현재 일부 상황에 맞는 메뉴 항목에서 반복해야하는 작은 프로젝트에서 작업하고 있습니다. 이 메뉴는 마우스 오른쪽 버튼 클릭 컨텍스트 메뉴로 시작하여 다양한 색상으로 나눈 다음 오브젝트로 분기됩니다. 선택한 색상 및 객체에 따라 양식의 객체가 변경됩니다. 그것은 꽤 지저분하지만, 불행히도 나는 이것을 끝내기위한 더 쉬운 방법을 볼 수 없다. (고맙게도 오직 하나의 메뉴만으로 끝난다.)foreach 루프를 사용하여 반복 된 상황에 맞는 메뉴 항목을 반복합니다.

내가 메뉴 항목과 색상을 생성하고 추가하지만, 각 색상 등과 같은 8 개체를 반복했다 : 첫째

foreach (MenuItem i in colors.MenuItems) 
{ 
    MenuItem one = new MenuItem(); 
    one.Text = "One"; 
    MenuItem two = new MenuItem(); 
    two.Text = "Two"; 
    MenuItem three = new MenuItem(); 
    three.Text = "Three"; 
    MenuItem four = new MenuItem(); 
    four.Text = "Four"; 
    MenuItem five = new MenuItem(); 
    five.Text = "Five"; 
    MenuItem six = new MenuItem(); 
    six.Text = "Six"; 
    MenuItem seven = new MenuItem(); 
    seven.Text = "Seven"; 
    MenuItem eight = new MenuItem(); 
    eight.Text = "Eight"; 
    i.MenuItems.Add(one); 
    i.MenuItems.Add(two); 
    i.MenuItems.Add(three); 
    i.MenuItems.Add(four); 
    i.MenuItems.Add(five); 
    i.MenuItems.Add(six); 
    i.MenuItems.Add(seven); 
    i.MenuItems.Add(eight); 
} 

먼저 일을, 나는 모든 오브젝트 메뉴 항목을 가지고 비효율적 생각 foreach 루프 내에서 만들어지기 때문에 나는 그것들을 바로 전에 옮겼습니다. 이 작업을 수행 할 때 객체는 최종 색상에만 추가되었습니다. 이것은 다소 이상하게 보였습니다. 왜 누군가가 이런 일이 일어 났는지 설명 할 수 있다면 고맙겠습니다.

두 번째로, 사람이 선택하는 메뉴 선택에 따라 마우스 오른쪽 단추로 클릭 한 개체를 변경하는 것이 계획입니다. 각 개별 메뉴 항목에 대해 Menu.Click 이벤트를 갖는 것 이외의 다른 메뉴 항목을 가져 오는 더 쉬운 방법이 있습니까?

도움을 주시면 감사하겠습니다. 사전에

감사합니다, 밥

+0

이 WPF 또는 WinForms입니까? –

답변

0

것부터 첫째, 모든 객체를 가지고있는 것이 비효율적이라고 생각했습니다. foreach 루프 안에 메뉴 항목이 만들어 졌으므로, 전에 이동 한 메뉴가 입니다. 이 작업을 수행했을 때 개체는 모두 최종 색 대신 최종 색 인 에만 추가되었습니다. 이것은 다소 이상하게 보였습니다. 누군가가이 발생 이유를 설명 할 수 있다면, 감사하게 생각합니다.

MenuItem은 하나의 개체의 하위 항목 일 수 있습니다. 프레임 워크는 조용히 자신이 자식으로 할당 된 마지막 물건의 하위 항목으로 만듭니다.

Alex Siepman의 솔루션과 비슷한 방식으로 코드에서 많은 반복을 제거 할 수 있습니다. 내가 Click 처리기를 추가하고 다른 작은 변화를 만들었습니다.

void Something() 
{ 
    MyColoredObject o = //something 
    var textValues = new[] {"Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight"}; 

    foreach (MenuItem color in colors.MenuItems) 
    { 
     for (int i = 1; i <= 8; i++) 
     { 
      MenuItem newItem = new MenuItem(); 
      newItem.Text = textValues[i]; 
      newItem.Click += NumberClickHandler(o, color, i); 
      color.MenuItems.Add(newItem); 
     } 
    } 
} 
EventHandler NumberClickHandler(MyColoredObject o, MenuItem color, int num) 
{ 
    return (s, e) => 
    { 
     // assign the color to o as identified by color and num 
    }; 
} 
+0

이것은 우수합니다. 정말 고마워요. 난 불행히도 stackoverflow 내가 그렇게 할 수 있기 전에 내가 15 평판이 필요로 귀하의 답변을 upvote 수 없습니다. 나는 명성이 15 이상일 때 다시 올 것이다. –

0

상황이 나에게 분명하지 않기 때문에 내가 알 귀하의 질문에 대답 할 수는 없지만 적어도 코드는 짧아 질 수 있습니다

var textvalues = new[] {"One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight"}; 

foreach (MenuItem i in colors) 
{ 
    var newItems = textvalues.Select(t => new MenuItem{Text = t}); 
    foreach (MenuItem newItem in newItems) 
    { 
     i.MenuItems.Add(newItem); 
    } 
} 
+0

답장을 보내 주셔서 대단히 감사드립니다. 난 불행히도 stackoverflow 내가 그렇게 할 수 있기 전에 내가 15 평판이 필요로 귀하의 답변을 upvote 수 없습니다. 나는 명성이 15 이상일 때 다시 올 것이다. –