Search code examples
c#listviewscreen-readersjaws-screen-reader

JAWS not reading listview column headers


I've created a C# Windows Forms application in .NET. It has a main form. Main form has a ListView control with four columns as below:

  1. First Name
  2. Last Name
  3. Age
  4. Gender

I populate the list view with 1 row with following values

  1. First Name - Rasik
  2. Last Name - Bihari
  3. Age - 32
  4. Gender - Male

Here is the screenshot:

enter image description here

I'm trying to test its accessibility for specially-abled users through JAWS screen reader tool. The issue is that whenever I select one of the rows it reads only the value of all the column values one by one. It doesn't read the header text along with it. My expectation is that it should read like -

First Name : Rasik
Last Name : Bihari
Age : 32
Gender : Male

JAWS support some keyboard shortcuts to have this behavior explicitly. Like if you press Insert + Ctrl + 1 then it will read the value of first column like this -

First Name : Rasik

If you press Insert + Ctrl + 2 then it will read the value of second column like this -

Last Name : Bihari

I want this behavior by default so that as soon we select a row in the ListView control i.e. it should read the entire row in 'column header text' : 'column value' pairs.

Does anyone has any clue on this if there is any property of listView control which need to be set or any setting in JAWS which can be of help?

If you are looking for a sample behavior then open Visual Studio -> Go to Debug Menu -> Click Attach to Process menu item. In Attach to Process window there is a group box Available Processes which shows the list of all available processes to which you can attach your code. It is also a ListView control. When I run JAWS with Visual Studio, on this window it reads all the column header text and column value pairs one by one when I select a row by mouse. I expect the same behavior for my application also.

enter image description here

But on the same machine JAWS is behaving differently for my application.


Solution

  • I was able to figure this out myself. There was no additional coding required to achieve it. Actually JAWS by default suppresses this reading behavior through its configuration. You need to configure JAWS explicitly to read the rows of a list view in <Column Header> - <Column Value> fashion.

    When your application is running and the current focus is on a list view control on the form being displayed, press JAWS KEY + F2. It opens JAWS manager popup showing a list of what all items can be configured. Choose second option Customize ListView and press OK (Refer screenshot):

    enter image description here

    On the Customize Headers window you will see that currently Ignore radio button is selected (Refer screenshot):

    enter image description here

    Change the radio button selection to the appropriate option to alter the screen reading behavior for ListView control.

    The most irritating issue is that this configuration needs to be done separately for every list view control appearing in your application. There is no centralized mechanism to configure it in one go for your entire application.

    Note: Since by default JAWS is configured to read only column values, this means that it is appropriate for specially abled users. Freedom scientific must have researched around it as reading the column headers might be extraneous/trivial information which is not desired at once.

    Also, if the specially abled user wants to read the column headers then JAWS KEY + Ctrl + Column Header Index keyboard shortcut is always available to read it in that format.

    Note: Different screen reader tools like Thunder, NVA behave differently while reading a ListView.