2010-02-16 84 views
5

Ok vì vậy tôi đang cố gắng để di chuyển các mục từ một ListBox để khác bằng cách sử dụng nhiều nút tức làVô hiệu hóa nút vấn đề trên C#

tôi có 2 nút cmdRight và cmdRight2 đó đều vô hiệu hóa trên tải dạng

Nếu người dùng chọn một mục duy nhất trên hộp danh sách đầu tiên một nút cmdRIght cho phép nhưng cmdRight2 vẫn bị tắt, nếu người dùng chọn nhiều mục trên hộp danh sách đầu tiên, nút cmdRight2 cho phép nhưng cmdRight bị tắt.

Tôi có các nút di chuyển để hoạt động nhưng sự cố tôi gặp phải sau khi di chuyển nhiều mục bằng nút cmdRight2 nút cmdRight cho phép (chỉ nên bật sau khi chọn một mục trong hộp danh sách). Tôi đã thử rất nhiều câu lệnh if… nhưng nó vẫn xảy ra.

Tôi mới tham gia C# nên mọi trợ giúp sẽ được đánh giá cao.

cảm ơn

 private void lbList1_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      if (this.lbList1.SelectedItems != null) 
      { 
       cmdRight.Enabled = true; //enable cmdRight 
       cmdClear.Enabled = true; //enable cmdClear 
       if (this.lbList1.SelectedItems.Count > 1)//if multiple items selected 
       { 
        cmdRight.Enabled = false; 
        cmdRight2.Enabled = true; //enable cmdRight2    
       } 
      } 
     } 


    private void cmdRight2_Click(object sender, EventArgs e) 
    { 
     foreach (int i in lbList1.SelectedIndices) 
     { 
      lbList2.Items.Add(lbList1.Items[i].ToString()); 
     } 
     while (lbList1.SelectedItems.Count > 0) 
     { 
      lbList1.Items.Remove(lbList1.SelectedItems[0]); 
     } 
     cmdRight2.Enabled = false; 

    } 

    private void cmdRight_Click(object sender, EventArgs e) 
    { 
     lbList2.Items.Add(lbList1.SelectedItem); //Add selected item from list1 to list2 
     lbList1.Items.Remove(lbList1.SelectedItem);//remove the selected item in list1 

     cmdRight.Enabled = false; //disable cmdRight 
    } 
+0

Có bạn đặt breakpoint tại bắt đầu của từng chức năng để xem thứ tự mà chúng đang được gọi? Hoặc ít nhất, một điểm ngắt mỗi lần cmdRight.Enabled được đặt thành true. – taylonr

+1

Đây không phải là câu trả lời cho câu hỏi của bạn, nhưng tại sao không chỉ kết hợp hai nút (bằng cách loại bỏ cmdRight và giữ cmdRight2)? Rõ ràng là tôi không biết thiết kế của bạn, nhưng nó có lẽ sẽ giải quyết vấn đề của bạn. –

+0

Tôi đã thử các điểm ngắt và vì lý do nào đó câu lệnh if "if (this.lbList1.SelectedItems! = Null)" có vẻ luôn đúng. Ngay cả khi không có gì được chọn –

Trả lời

1

Tôi nghĩ rằng bạn muốn

if (this.lbList1.SelectedItems.Count == 1) 
{ 
} 
else if(this.lbList1.SelectedItems.Count > 1) 
{ 
} 
else 
{ 
} 

thay vì

if (this.lbList1.SelectedItems != null) 

Sau đó, bạn có thể đặt tất cả điều này trong một phương pháp gọi là "EnableButtons" như đã đề cập ở những nơi khác

+0

Yey !!! Điều đó làm việc cảm ơn bạn rất nhiều! Tôi sẽ nghiên cứu phương pháp tiếp theo. Cảm ơn bạn rất nhiều! –

+0

Khi bạn đang làm việc thông qua các vấn đề, và bạn thấy một cái gì đó như SelectedItems là không bao giờ null, bạn sẽ cần phải tìm một công tắc khác (như trong trường hợp này, số mục bầu) – taylonr

3

Làm thế nào về việc tạo ra một phương pháp EnableButtons cho phép/vô hiệu hóa các nút theo các tiêu chí nhất định như "cho phép cmdRight2 chỉ khi .... là đúng".

Sau đó, hãy gọi phương thức bất cứ khi nào một số tiêu chí có thể thay đổi. Lợi thế của điều này qua cách bạn đang làm bây giờ là các tiêu chí trong phương thức là "tuyệt đối" (trong đó các nút được bật hoặc tắt trong một lần) thay vì "tương đối" (bật nút khi người dùng thực hiện điều này hay điều đó).

Bạn cũng có thể gọi phương thức này từ sự kiện Application.Idle thay vì gọi nó để phản hồi lại một số hành động của người dùng.

EDIT

Khai báo các phương pháp sau đây:

private void EnableButtons() 
{ 
    controlX.Enabled = (<condition...>); 
    controlY.Enabled = (<condition...>); 
} 

Bạn có thể gọi rằng phương pháp từ các vị trí trong mã nơi một cái gì đó nên thay đổi trong các nút bang kích hoạt, hoặc bạn có thể làm theo sau trong hàm tạo của biểu mẫu:

public Form1() 
{ 
    // Other code... 

    Application.Idle += new <The respective event handler>; 
} 

Sau đó, khai báo phương thức có chữ ký tương ứng cho sự kiện và gọi EnableButtons ở đó. Phương thức này sẽ được gọi trong các tình huống mà ứng dụng của bạn là "nhàn rỗi" (chờ hành động của người dùng).

+0

Tôi khá mới lập trình nên tôi không chắc chắn làm thế nào để làm điều đó ...: -S –

+0

Đề nghị tốt.Bạn vẫn sẽ cần phải sửa chữa các logic cho phép/vô hiệu hóa, mặc dù – taylonr

+0

@KP: Tôi đã chỉnh sửa trả lời của tôi với một số mã giả. Ý tôi là, tôi không có ý nghĩ chính xác ngay bây giờ –

0

Vấn đề là bạn đang loại bỏ từng mục một, vì vậy khi chỉ còn một mục, về cơ bản bạn có một mục được chọn để chương trình của bạn bật lệnh cmdRight. Cách dễ nhất xung quanh việc này là có

cmdRight2.Enabled = false; 
cmdRight.Enabled = false; 

ở cuối phương pháp cmdRight2_Click.

Các vấn đề liên quan