Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
C# ПІДРУЧНИКИ / c# / Manning - Windows.forms.programming.with.c#.pdf
Скачиваний:
108
Добавлен:
12.02.2016
Размер:
14.98 Mб
Скачать

Unlike our message for the Open handler, this code makes use of the result returned by the Show method. This result is a DialogResult enumeration that indicates the button pressed. The values in this enumeration are shown in .NET Table 8.2, and correspond to the kinds of buttons typically found in Windows dialogs.

.NET Table 8.2 DialogResult enumeration

The DialogResult enumeration represents a value returned by a dialog box. This class is part of the System.Windows.Forms namespace, and is used with all dialog boxes in Windows Forms. In particular, a DialogResult is returned by the MessageBox.Show method as well as the ShowDialog method in both the Form class and common dialogs derived from the CommonDialog class. This enumeration is also used by the Button class to indicate the result to automatically return from a modal dialog when the button is clicked.

 

Abort

The dialog return value is Abort. Typically, this means the user

 

 

clicked an Abort button.

 

Cancel

The dialog returns Cancel, typically from a Cancel button.

 

Ignore

The dialog returns Ignore, typically from an Ignore button.

Enumeration

No

The dialog returns No, typically from a No button.

Values

None

The dialog returns nothing, indicating that the dialog box is still

 

 

 

running.

 

OK

The dialog returns OK, typically from an OK button.

 

Retry

The dialog returns Retry, typically from a Retry button.

 

Yes

The dialog returns Yes, typically from a Yes button.

 

 

 

You can compile and run this code if you would like to see the message boxes we created. You can generate an open error easily enough by selecting a file that is not, in fact, an album file. A save error can be generated by attempting to save to a read-only CD, or by filling up a floppy disk and then saving a file to it.

Our last example will generate a message box for closing an existing album.

8.1.4Creating A YesNoCancel dialog

Our final example is the case where an album has changed but is about to be discarded. This can occur when the application is about to exit, when loading a new album with the Open menu item, and when creating a new album with the New menu item.

To handle these situations in a consistent way, we will create a protected method to gracefully close the current album for all three cases using the dialog in figure 8.4. We will call this method CloseCurrentAlbum and have it return a boolean value indicating

whether the album was closed or the user clicked the Cancel button.

Figure 8.4 This dialog is displayed when an album is about to be discarded.

230

CHAPTER 8 DIALOG BOXES

The three buttons in our dialog will correspond to the following behavior in our

CloseCurrentAlbum method:

Yes will save the album, then close the album and return true.

No will not save the album, then close the album and return true.

Cancel will not save or close the album and return false to indicate that the calling operation should be canceled.

To close the album, CloseCurrentAlbum will clear the album and related settings. The following steps create this method:

 

ADD A CLOSECURRENTALBUM METHOD

 

 

 

 

Action

Result

 

 

 

1

Add the

protected bool CloseCurrentAlbum()

 

CloseCurrentAlbum

{

 

 

 

method to the

 

 

MainForm.cs source code

 

 

window.

 

 

 

 

2

Offer to save the album if it

if (_bAlbumChanged)

 

has been modified.

{

 

 

// Offer to save the current album

 

 

 

3

Define an appropriate

string msg;

 

message to display.

if (_album.FileName == null)

 

Note: We vary the mes-

msg = "Do you want to save the "

 

+ "current album?";

 

sage text depending on

else

 

whether the current album

msg = String.Format("Do you want to "

 

+ "save your changes to \n{0}?",

 

has a name or not.

 

_album.FileName);

 

 

 

4

Display the message box

DialogResult result

 

and record the result.

= MessageBox.Show(this, msg,

 

 

"Save Current Album?",

 

 

MessageBoxButtons.YesNoCancel,

 

 

MessageBoxIcon.Question);

 

 

 

5

Perform the action

if (result == DialogResult.Yes)

 

requested by the user.

menuSave_Click(this,EventArgs.Empty);

 

 

else if (result == DialogResult.Cancel)

 

 

{

 

 

// Do not close the album

 

 

return false;

 

 

}

 

 

}

 

 

 

6

Close the album and return

// Close the album and return true

 

true.

if (_album != null)

 

Note: This action is only

_album.Dispose();

 

_album = new PhotoAlbum();

 

performed if the Yes or No

SetTitleBar();

 

button was selected.

_bAlbumChanged = false;

 

return true;

 

 

 

 

}

 

 

 

We will use this new method in three different places to ensure that the user has the option of saving any changes he or she might make to the album.

MESSAGE BOXES

231

In menuNew_Click to save the existing album before a new album is created.

In menuOpen_Click to save the album before a new album is selected.

In menuExit_Click to save the album before the application exits.

We will modify the handlers for the New and Open menus here. The Exit menu presents some additional issues, which we will take up in the next section. The following table continues our previous steps.

UPDATE THE HANDLERS FOR THE NEW AND OPEN MENUS

 

Action

Result

 

 

 

7

Modify the menuNew_Click

protected void menuNew_Click

 

method to use the

(object sender, System.EventArgs e)

 

CloseCurrentAlbum method.

{

 

if (this.CloseCurrentAlbum() == true)

 

 

 

 

{

 

 

// Make sure the window is redrawn

 

 

this.Invalidate();

 

 

}

 

 

}

 

 

 

8

Modify the menuOpen_Click

protected void menuOpen_Click

 

method to use the

(object sender, System.EventArgs e)

 

CloseCurrentAlbum method.

{

 

// Save the existing album, if necessary

 

 

 

Note: The new code here

if (this.CloseCurrentAlbum() == false)

 

replaces the previous code in

{

 

// Cancel this operation

 

this method to save the current

 

return;

 

album. The remainder of this

}

 

method stays the same.

OpenFileDialog dlg = new OpenFileDialog();

 

 

 

 

. . .

 

 

}

 

 

 

These changes make our application much more user-friendly by interacting with the user when they are about to discard a modified album.

TRY IT! Before moving on, create a MessageBox dialog in the menuRemove_Click method, where the current photograph is removed without any confirmation by the user. Add a question box here to verify that the user does indeed want to remove the current photo.

Another place where a message box could be used is at the beginning and end of the album. Modify the Next and Previous menus to display an information dialog whenever the user tries to move before the beginning of the album or past the end.1

For the Exit menu, life is not so easy. We will pick up this topic in the next section.

1 The interface designers among us will argue that the Previous and Next commands should be disabled at the beginning and end of the album, respectively. Why allow the user to invoke a menu item that does not work? I would not disagree, and if you prefer this approach, please go right ahead.

232

CHAPTER 8 DIALOG BOXES

Соседние файлы в папке c#