2015-05-21 3 views
3

Я попытался сделать простой интерфейс sudoku с помощью dataGridView. Проблема в том, что я не могу заставить работать DividerHeight. Приведенный ниже код может изменить ширину вертикального делителя, но не горизонтальный разделитель:Как я могу заставить DataGridView.Rows.DividerHeight работать?

public partial class Form1 : Form 
{ 
    private DataTable sudokuTable; 

    public Form1() 
    { 
     InitializeComponent(); 
     sudokuTable = getTable(); 
     dataGridView1.DataSource = sudokuTable; 

     for (int i = 0; i < 9; i++){       
      dataGridView1.Columns[i].Width = 25; 
     } 

     dataGridView1.Columns[2].DividerWidth = 5; //Working 
     dataGridView1.Columns[5].DividerWidth = 5; //Working 
     dataGridView1.Rows[2].DividerHeight = 5; //Not working 
     dataGridView1.Rows[5].DividerHeight = 5; //Not working 

    } 


    private static DataTable getTable() 
    { 
     DataTable newDataTable = new DataTable(); 


     for (int i = 0; i < 9; i++) 
     { 
      newDataTable.Columns.Add("c" + i+1, typeof(int));      
     } 

     newDataTable.Rows.Add(1, 2, 3, 4, 5, 6, 7, 8, 9); 
     newDataTable.Rows.Add(1, 2, 3, 4, 5, 6, 7, 8, 9); 
     newDataTable.Rows.Add(1, 2, 3, 4, 5, 6, 7, 8, 9); 
     newDataTable.Rows.Add(1, 2, 3, 4, 5, 6, 7, 8, 9); 
     newDataTable.Rows.Add(1, 2, 3, 4, 5, 6, 7, 8, 9); 
     newDataTable.Rows.Add(1, 2, 3, 4, 5, 6, 7, 8, 9); 
     newDataTable.Rows.Add(1, 2, 3, 4, 5, 6, 7, 8, 9); 
     newDataTable.Rows.Add(1, 2, 3, 4, 5, 6, 7, 8, 9); 
     newDataTable.Rows.Add(1, 2, 3, 4, 5, 6, 7, 8, 9); 

     return newDataTable; 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 

    } 
} 

Есть некоторые свойства, которые я должен изменить, чтобы сделать его работу?

Я нашел ссылку с предложением dividerHeight не реализован:

http://www.visualwebgui.com/Developers/Forums/tabid/364/forumid/68/threadid/68506/scope/posts/Default.aspx

это правда?

(Я использую Visual Studio Community 2013 и Net Framework 4.5)

+0

Ваш код отлично работает. У меня нет проблем с отображением разделителей. Какая у вас проблема? Обратите внимание, что вы должны добавить толщину делителя к строкам и столбцам, в которых разделители: 'dataGridView1.Columns [i] .Width = 25 + ((i + 1)% 3 == 0? 5: 0);' – TaW

+0

Я не дошел до сути всего, но похоже, что это проблема времени. – TaW

+0

Прошу прощения. Я не знал, что смогу это сделать. Я очень благодарен за ваш ответ. – Snofe

ответ

3

Ваш код работает нормально. За несколько дополнительных штрихов это выглядит следующим образом:

enter image description here

В основном это ваш код, примененный к нормальной DataGridView недавно упал в форму ..:

private void button1_Click_1(object sender, EventArgs e) 
{ 
    dataGridView1.DataSource = null; 
    dataGridView1.Rows.Clear(); 
    dataGridView1.Columns.Clear(); 

    sudokuTable = getTable(); 
    dataGridView1.DataSource = sudokuTable; 

    for (int i = 0; i < 9; i++) 
    { 
     dataGridView1.Columns[i].Width = 25 + ((i+1)%3 == 0 ? 5:0); 
    } 

    dataGridView1.Columns[2].DividerWidth = 5; 
    dataGridView1.Columns[5].DividerWidth = 5; 
    dataGridView1.Rows[2].DividerHeight = 5; 
    dataGridView1.Rows[5].DividerHeight = 5; 

    dataGridView1.Rows[2].Height += 5; 
    dataGridView1.Rows[5].Height += 5; 

    dataGridView1.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter; 

    dataGridView1.RowHeadersVisible = false; 
    dataGridView1.ColumnHeadersVisible = false; 
    dataGridView1.AllowUserToAddRows = false; 
    dataGridView1[0, 0].Selected = false; 
} 

на все функции getTable Никаких изменений ..

Update: Я не был в состоянии воспроизвести проблему. Мой DataGridView находится на TabPage, который не был выбран при запуске. Вызвав кнопку, щелкните код до, выбрав вкладку. Я увидел вашу ошибку; когда я выстроен в линии, чтобы выбрать вкладку первого он работал снова .. выглядит как проблема/ошибка DGV имеют с его макетом , когда не видно ..

Примечания: Это никогда работает, когда вы позвоните в конструктор ! Это слишком рано. Form_Load прекрасно, хотя ..

В качестве временного решения проблемы , вы можете переместить код на Start Button. (При наличии кнопки «Пуск», вероятно, хорошая идея, в следующем раунде ..)

+0

Спасибо. Сделал то, что вы предложили, и переместил код в button_click Method, и я сработал! :-D – Snofe

+0

Можете ли вы сказать мне: Является ли DataGridView видимым при запуске? Шахта была на вкладке, и она отлично работала после того, как я выбрал страницу, на которой он был включен, прежде чем заполнять ее. – TaW

+0

Все было правдоподобно, за исключением горизонтальных разделителей – Snofe

0

ОТКАЗ ОТ: Как обнаружили TaW, код OP отлично работает при перемещении из формы конструктора Form_Load. См. his answer. Я оставляю этот ответ исключительно для будущей справки и как дополнительный вариант.


Я считаю, что это что-то делать с DataSource переплета. Для акцента: Я взял свой код (который также не работал на рядных делителей для меня) и решил испытать что-то еще - из-за комментарий:

предлагая dividerHeight не реализованного

I протестированы следующие, уверен, что он будет реализован:

dataGridView1.Columns[2].DefaultCellStyle.BackColor = Color.Red; 
dataGridView1.Rows[2].DefaultCellStyle.BackColor = Color.Red; 

колонка была успешно цвета, но строка осталась неизменной. Это привело меня к сомнению, было ли это обязательным, поскольку я видел, что связал причину некоторых странных проблем, прежде чем стилизовать, доступность и т. Д. Действительно, привязка DataSource к другим вещам (например, List пользовательских объектов строк) также не удалась.

Вышеупомянутое изменение стиля относится к строкам, а привязка «сбой», потому что Form, а затем DataGridView, еще не виден. По умолчанию видимость и привязки не изменяются/обрабатываются за кулисами до после. Конструктор работает, конечно.


Поэтому я принял вашу общую идею, идею TAW в для коррекции ширины и высоты [], и удалить DataSource - заменить его с ручным заполнением DataGridView. Для выполнения описанного вами желаемого результата был выполнен следующий результат:

private List<int> dividers = new List<int>() { 2, 5 }; 
private int pad = 5; 

public Form1() 
{ 
    InitializeComponent(); 
    InitializeDataGridView(); 
} 

private void InitializeDataGridView() 
{ 
    dataGridView1.AllowUserToAddRows = false; 

    for (int i = 0; i < 9; i++) 
    { 
     DataGridViewTextBoxColumn column = new DataGridViewTextBoxColumn(); 
     column.HeaderText = "c" + (i + 1); 
     column.Width = 25 + (dividers.Contains(i) ? pad : 0); 
     dataGridView1.Columns.Add(column); 
    } 

    for (int i = 0; i < 9; i++) 
    { 
     DataGridViewRow row = new DataGridViewRow(); 
     row.CreateCells(dataGridView1); 
     row.Height = row.Height + (dividers.Contains(i) ? pad : 0); 
     dataGridView1.Rows.Add(row); 

     foreach (DataGridViewCell cell in dataGridView1.Rows[i].Cells) 
     { 
      cell.Value = cell.ColumnIndex; 
     } 
    } 

    foreach (int div in dividers) 
    { 
     dataGridView1.Columns[div].DividerWidth = pad; 
     dataGridView1.Rows[div].DividerHeight = pad; 
    } 
} 
Смежные вопросы