C# Проблема с поиском

  • Автор темы WInk
  • Дата начала
Статус
Закрыто для дальнейших ответов.
W

WInk

#1
Программа написана на С#. Тип - база данных. При попытке ввода запроса в окно поиска выскакивает следующее сообщение:
"Необрабатываемое исключение в приложении". Текст исключения:
"System.InvalidOperationException: Непереданные новые строки нельзя сделать невидимыми.
в System.Windows.Forms.DataGridViewBand.set_Visible(Boolean value)
в System.Windows.Forms.DataGridViewRow.set_Visible(Boolean value)
в Учебная_группа.Основное_окно.toolStripTextBox1_TextChanged(Object sender, EventArgs e) в C:\Users\Владелец\Desktop\Учебная_группа (рабочая версия)\Учебная_группа\Основное_окно.cs:строка 506
в System.Windows.Forms.ToolStripItem.RaiseEvent(Object key, EventArgs e)
в System.Windows.Forms.ToolStripItem.OnTextChanged(EventArgs e)
в System.Windows.Forms.ToolStripControlHost.HandleTextChanged(Object sender, EventArgs e)
в System.Windows.Forms.Control.OnTextChanged(EventArgs e)
в System.Windows.Forms.TextBoxBase.OnTextChanged(EventArgs e)
в System.Windows.Forms.TextBoxBase.WmReflectCommand(Message& m)
в System.Windows.Forms.TextBoxBase.WndProc(Message& m)
в System.Windows.Forms.TextBox.WndProc(Message& m)
в System.Windows.Forms.ToolStripTextBox.ToolStripTextBoxControl.WndProc(Message& m)
в System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
в System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
в System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)"
Вот код тела (Основное_окно.cs):

C++:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Xml.Schema;
using System.Xml;


namespace Учебная_группа
{
public partial class Основное_окно : Form
{
static public List<int> grafic = new List<int>(); //массив для построения графика, содержащий кол-во человек на каждом курсе и номер курса
static public string фамилияСтудента;

public Основное_окно()
{
InitializeComponent();
}
public Вход_в_программу f2;
public График f4;
public О_программе f5;
public Информация f6;
public OpenFileDialog openFileDialog = new OpenFileDialog();
public SaveFileDialog saveFileDialog = new SaveFileDialog();
public string имяОткрытогоФайла;
public DataGridViewRowCollection строки;
private int рейтинг1, рейтинг2, рейтинг3, рейтинг4, рейтинг5;
private bool отметка = false;


private void Основное_окно_Load(object sender, EventArgs e)
{
f2 = new Вход_в_программу();
f2.ShowDialog();
if (!f2.flag2)
{
РежимОграниченнойФункциональности();
}
// Открыть();
}
private void полнойФункциональностиToolStripMenuItem_Click(object sender, EventArgs e)
{
f2 = new Вход_в_программу();
f2.ShowDialog();
if (!f2.flag2)
{
РежимОграниченнойФункциональности();
}
else
{
РежимПолнойФункциональности();
}
}

private void ограниченнойФункциональностиToolStripMenuItem_Click(object sender, EventArgs e)
{
РежимОграниченнойФункциональности();
}

private void РежимОграниченнойФункциональности()
{
сохранитьToolStripMenuItem.Visible = false;
сохранитьКакToolStripMenuItem.Visible = false;
сохранить.Visible = false;
информацияОбУчебныхГруппах.AllowUserToAddRows = false;
информацияОбУчебныхГруппах.AllowUserToDeleteRows = false;
информацияОСтудентах.AllowUserToAddRows = false;
информацияОСтудентах.AllowUserToDeleteRows = false;
}

private void РежимПолнойФункциональности()
{
сохранитьToolStripMenuItem.Visible = true;
сохранитьКакToolStripMenuItem.Visible = true;
сохранить.Visible = true;
информацияОбУчебныхГруппах.AllowUserToAddRows = true;
информацияОбУчебныхГруппах.AllowUserToDeleteRows = true;
информацияОСтудентах.AllowUserToAddRows = true;
информацияОСтудентах.AllowUserToDeleteRows = true;
}

private void сохранитьToolStripMenuItem_Click(object sender, EventArgs e)
{
Сохранить(/*имяОткрытогоФайла*/);
}

private void сохранитьКакToolStripMenuItem_Click(object sender, EventArgs e)
{
/// сохранить как
saveFileDialog.InitialDirectory = Environment.CurrentDirectory;
saveFileDialog.DefaultExt = "*.xml";
saveFileDialog.Filter = "Xml Files|*.xml";

if (saveFileDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK &&
saveFileDialog.FileName.Length > 0)
try
{

группы_Факультет.WriteXml(saveFileDialog.FileName);//, XmlWriteMode.WriteSchema);
MessageBox.Show("Файл сохранен.");
}
catch
{
MessageBox.Show("Произошла ошибка. К сожалению данные не сохранились.");
return;
}
имяОткрытогоФайла = saveFileDialog.FileName;
}

private void сохранить_Click(object sender, EventArgs e)
{
Сохранить(/*имяОткрытогоФайла*/);
}

private void Сохранить(/*string имяОткрытогоФайла*/)
{

string filePath = Environment.CurrentDirectory +"\\Учебная Группа+Схема.xml"; 
//filePath = filePath + "\\" + имяОткрытогоФайла;

/// Записать данные набора в XML-файл.
try
{

группы_Факультет.WriteXml(filePath);//, XmlWriteMode.WriteSchema);
MessageBox.Show("Файл сохранен.");
}
catch
{
MessageBox.Show("Произошла ошибка. К сожалению данные не сохранились.");
return;
}
}

private void открытьToolStripMenuItem_Click(object sender, EventArgs e)
{
Открыть();
}

private void открыть_Click(object sender, EventArgs e)
{
Открыть();
}
private void Открыть()
{
openFileDialog.DefaultExt = "*.xml";
openFileDialog.Filter = "Xml Files|*.xml";
информацияОбУчебныхГруппах.DataSource = null;
информацияОСтудентах.DataSource = null;
группы_Факультет.таблицаУчебныеГруппы.DataSet.Clear();
группы_Факультет.таблицаСтуденты.DataSet.Clear();


if (openFileDialog.ShowDialog() == DialogResult.OK &&
openFileDialog.FileName.Length > 0)
{
try
{
группы_Факультет.ReadXml(openFileDialog.FileName);//, XmlReadMode.ReadSchema);
информацияОбУчебныхГруппах.DataSource = группы_Факультет.таблицаУчебныеГруппы;
информацияОСтудентах.DataSource = группы_Факультет.таблицаСтуденты;
}
catch (XmlException)
{
MessageBox.Show("Ошибка в структуре исходного XML файла");
}
catch (OutOfMemoryException)
{
MessageBox.Show("Недостаточно памяти");
}
имяОткрытогоФайла = openFileDialog.FileName;
}
ПодсчетКоличестваСтудентовИГрупп();
}

private void ПодсчетКоличестваСтудентовИГрупп()
{
if (!f2.flag2)
{
toolStripStatusLabel2.Text = информацияОСтудентах.Rows.Count.ToString();
toolStripStatusLabel4.Text = информацияОбУчебныхГруппах.Rows.Count.ToString();
}
else
{
int k1, k2;
k1 = информацияОСтудентах.Rows.Count - 1;
k2 = информацияОбУчебныхГруппах.Rows.Count - 1;
toolStripStatusLabel2.Text = k1.ToString();
toolStripStatusLabel4.Text = k2.ToString();
}
}

private void график_Click(object sender, EventArgs e)
{
f4 = new График();
f4.ShowDialog();
}

private void оПрограммеToolStripMenuItem_Click(object sender, EventArgs e)
{
f5 = new О_программе();
f5.ShowDialog();
}

private void информацияОСтудентах_RowHeaderMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
{
grafic.Clear();
for (int i = 4; i < 9; i++)
{
try
{
рейтинг1 = int.Parse(информацияОСтудентах.Rows[e.RowIndex].Cells[i].Value.ToString());
}
catch (FormatException)
{
MessageBox.Show("Ошибка!!! Проверьте корректность данных в столбцах рейтинга");
}
Формирование_массива_для_графика();
}
фамилияСтудента = информацияОСтудентах.Rows[e.RowIndex].Cells[2].Value.ToString();
f4 = new График();
f4.ShowDialog();
}

private void Формирование_массива_для_графика()
{
grafic.Add(рейтинг1);
}

private void стипендия_CheckedChanged(object sender, EventArgs e)
{
if (стипендия.Checked)
{
ОтметитьСтудентов();
отметка = true;
}
else
{
if (отметка == true)
{
УдалитьОтметку();
отметка = false;
}
}
}

private void успеваемость_CheckedChanged(object sender, EventArgs e)
{
if (успеваемость.Checked)
{
ОтметитьСтудентов();
отметка = true;
}
else
{
if (отметка == true)
{
УдалитьОтметку();
отметка = false;
}
}
}
private void ОтметитьСтудентов()
{
//int сумма = 0;
if (f2.flag2)
{
информацияОСтудентах.AllowUserToAddRows = false;
}
строки = информацияОСтудентах.Rows;
ПоискСтудентовСПлохойУспеваемостью(строки);
}

private void ПоискСтудентовСПлохойУспеваемостью(DataGridViewRowCollection строки)
{
int сумма = 0;
int среднийБалл = 0;
foreach (DataGridViewRow row in строки) // Перебираем строки 
{
if (row.Cells[4].Value == null)
{
MessageBox.Show("Информация об успеваемости отсутствует! \n Поверьте заполнены ли столбцы с рейтингом");
//break; 
}
else if (row.Cells[4].Value != null && row.Cells[5].Value == null)
{
try
{
рейтинг1 = int.Parse(row.Cells[4].Value.ToString());
}
catch (FormatException)
{
MessageBox.Show("Ошибка!!! Проверьте корректность данных в столбцах рейтинга");
}
сумма = рейтинг1;
среднийБалл = сумма;
//break; 
}
else if (row.Cells[4].Value != null && row.Cells[5].Value != null && row.Cells[6].Value == null)
{
try
{
рейтинг1 = int.Parse(row.Cells[4].Value.ToString());
рейтинг2 = int.Parse(row.Cells[5].Value.ToString());
}
catch (FormatException)
{
MessageBox.Show("Ошибка!!! Проверьте корректность данных в столбцах рейтинга");
}
сумма = рейтинг1 + рейтинг2;
среднийБалл = сумма / 2;
//break; 
}
else if (row.Cells[4].Value != null && row.Cells[5].Value != null && row.Cells[6].Value != null && row.Cells[7].Value == null)
{
try
{
рейтинг1 = int.Parse(row.Cells[4].Value.ToString());
рейтинг2 = int.Parse(row.Cells[5].Value.ToString());
рейтинг3 = int.Parse(row.Cells[6].Value.ToString());
}
catch (FormatException)
{
MessageBox.Show("Ошибка!!! Проверьте корректность данных в столбцах рейтинга");
}
сумма = рейтинг1 + рейтинг2 + рейтинг3;
среднийБалл = сумма / 3;
//break;
}
else if (row.Cells[4].Value != null && row.Cells[5].Value != null && row.Cells[6].Value != null && row.Cells[7].Value != null && row.Cells[8].Value == null)
{
try
{
рейтинг1 = int.Parse(row.Cells[4].Value.ToString());
рейтинг2 = int.Parse(row.Cells[5].Value.ToString());
рейтинг3 = int.Parse(row.Cells[6].Value.ToString());
рейтинг4 = int.Parse(row.Cells[7].Value.ToString());
}
catch (FormatException)
{
MessageBox.Show("Ошибка!!! Проверьте корректность данных в столбцах рейтинга");
}
сумма = рейтинг1 + рейтинг2 + рейтинг3 + рейтинг4;
среднийБалл = сумма / 4;
//break; 
}
else
{
try
{
рейтинг1 = int.Parse(row.Cells[4].Value.ToString());
рейтинг2 = int.Parse(row.Cells[5].Value.ToString());
рейтинг3 = int.Parse(row.Cells[6].Value.ToString());
рейтинг4 = int.Parse(row.Cells[7].Value.ToString());
рейтинг5 = int.Parse(row.Cells[8].Value.ToString());
}
catch (FormatException)
{
MessageBox.Show("Ошибка!!! Проверьте корректность данных в столбцах рейтинга");
}
сумма = рейтинг1 + рейтинг2 + рейтинг3 + рейтинг4 + рейтинг5;
среднийБалл = сумма / 5;
// break; 
}

if (успеваемость.Checked)
{
if (среднийБалл < 40)
{
row.Cells[2].Style.BackColor = Color.DeepPink;
row.Cells[3].Style.BackColor = Color.DeepPink;
}
}
else if (стипендия.Checked)
{
if (сумма >= 400)
{
row.Cells[2].Style.BackColor = Color.DarkSeaGreen;
row.Cells[3].Style.BackColor = Color.DarkSeaGreen;
}
}
}
}
private void УдалитьОтметку()
{
foreach (DataGridViewRow row in информацияОСтудентах.Rows) // Перебираем строки 
{
row.Cells[2].Style.BackColor = SystemColors.Window;
row.Cells[3].Style.BackColor = SystemColors.Window;
}
if (!f2.flag2)
{
информацияОСтудентах.AllowUserToAddRows = false;
}
else
{
информацияОСтудентах.AllowUserToAddRows = true;
}
}

private void информацияОбУчебныхГруппах_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
{
строки = информацияОСтудентах.Rows; 
string номерГруппы = информацияОбУчебныхГруппах.Rows[e.RowIndex].Cells[0].Value.ToString();
//textBox1.Text = номерГруппы;
foreach (DataGridViewRow row in строки)
{
if (row.Cells[1].Value.ToString() == номерГруппы)
{
row.Visible = true;
}
else
{
row.Visible = false;
}
}

ПодсчетКоличестваСтудентовИГрупп();

//информацияОбУчебныхГруппах.Rows[e.RowIndex].Cells[1].Value.ToString() = toolStripStatusLabel2.Text;
}

private void информацияОСтудентах_CellContentDoubleClick(object sender, DataGridViewCellEventArgs e)
{
if (f2.flag2)
{
f6 = new Информация();
f6.ShowDialog();
}

}

private void среднийБаллToolStripMenuItem_Click(object sender, EventArgs e)
{
if (информацияОСтудентах.CurrentCellAddress != null)
{
int index = информацияОСтудентах.CurrentCellAddress.Y;
try
{
рейтинг1 = int.Parse(информацияОСтудентах.Rows[index].Cells[4].Value.ToString());
рейтинг2 = int.Parse(информацияОСтудентах.Rows[index].Cells[5].Value.ToString());
рейтинг3 = int.Parse(информацияОСтудентах.Rows[index].Cells[6].Value.ToString());
рейтинг4 = int.Parse(информацияОСтудентах.Rows[index].Cells[7].Value.ToString());
рейтинг5 = int.Parse(информацияОСтудентах.Rows[index].Cells[8].Value.ToString());
}
catch (FormatException)
{
MessageBox.Show("Ошибка!!! Проверьте корректность данных в столбцах рейтинга");
}
int среднийБалл = (рейтинг1 + рейтинг2 + рейтинг3 + рейтинг4 + рейтинг5) /5;
MessageBox.Show("Средний балл студента = " + среднийБалл.ToString(), "Средний балл");

}
}

private void суммуБалловToolStripMenuItem_Click(object sender, EventArgs e)
{
if (информацияОСтудентах.CurrentCellAddress != null)
{
int index = информацияОСтудентах.CurrentCellAddress.Y;
try
{
рейтинг1 = int.Parse(информацияОСтудентах.Rows[index].Cells[4].Value.ToString());
рейтинг2 = int.Parse(информацияОСтудентах.Rows[index].Cells[5].Value.ToString());
рейтинг3 = int.Parse(информацияОСтудентах.Rows[index].Cells[6].Value.ToString());
рейтинг4 = int.Parse(информацияОСтудентах.Rows[index].Cells[7].Value.ToString());
рейтинг5 = int.Parse(информацияОСтудентах.Rows[index].Cells[8].Value.ToString());
}
catch (FormatException)
{
MessageBox.Show("Ошибка!!! Проверьте корректность данных в столбцах рейтинга");
}
int суммаБаллов = рейтинг1 + рейтинг2 + рейтинг3 + рейтинг4 + рейтинг5;
MessageBox.Show("Сумма баллов студента = " + суммаБаллов.ToString(), "Сумма баллов");

}
}

private void toolStripTextBox1_TextChanged(object sender, EventArgs e) - алгоритм поиска
{
/*int i;
for (i = 0; i < информацияОСтудентах.Rows.Count - 1; i++)
информацияОСтудентах.Rows[i].Visible = true;*/
if (toolStripTextBox1.Text != "")
foreach (DataGridViewRow row in информацияОСтудентах.Rows)
{
row.Visible = true;

if (!((row.Cells[0].ToString() == toolStripTextBox1.Text) ||
(row.Cells[1].ToString() == toolStripTextBox1.Text)) ||
(row.Cells[2].ToString() == toolStripTextBox1.Text) ||
(row.Cells[3].ToString() == toolStripTextBox1.Text) ||
(row.Cells[4].ToString() == toolStripTextBox1.Text) ||
(row.Cells[5].ToString() == toolStripTextBox1.Text) ||
(row.Cells[6].ToString() == toolStripTextBox1.Text) ||
(row.Cells[7].ToString() == toolStripTextBox1.Text) ||
(row.Cells[8].ToString() == toolStripTextBox1.Text))
{
//информацияОСтудентах.Rows[row.Index].Visible = false;
[b]row.Visible = false;[/b] - 506 строка!
}
}
}
}
}
Не могу понять, что его не устраивает... Очень надеюсь на дельный совет от мастеров программирования. Заранее благодарю
 

vital

Больной Компом Детектед
29.01.2006
2 432
33
#2
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">sax_ol </div></div><div class="sp-body"><div class="sp-content">
а че, в шарпе можно использовать русские буквы в именах ф-й или переменных??? Омг.. Вот не знал. Это ж ппц, 1С получается..
 

vital

Больной Компом Детектед
29.01.2006
2 432
33
#3
sax_ol
ну хз. Блин, а мне как-то отвратно. _И не из-за языка, как такового_. Я про сами буквы) Ну как-то привыкли же все, что нельзя кириллицу. И давно привыкли) А тут.. брр. т.е. если бы код выше писал я, то был бы транслит(если не англ.вариант). А так.. Ну блин, ужос)
 
W

WInk

#5
Это фильтрация? ее делают не так. фильтруют данные, грид сам уберет ненужные
А что именно в ней не так? Просто удивительно, но, я поменяла параметры отображения: Visible = true на .Cells[2].Style.BackColor = Colors.Red, а Visible = false на .Cells[2].Style.BackColor = SystemColors.Window

Теперь он работает оО правда вместо того, чтобы скрывать несоответствующую информацию, он ее оставляет невыделеной. Это конечно не то, что требуется... а как наладить это фильтр я просто уже ума не приложу =(
 
W

WInk

#6
Либо переделать, либо попробуйте вместо всего вашего форыча просто группы_Факультет.таблицаСтуденты.DefaultView.Filter = "тут нужен фильтр"
Я на C# работаю недавно и в фильтрах еще ориентрируюсь плохо... тогда мне не совсем ясно, как заставить его искать в данных? Он и так ищет внутри таблицы, в которую введены данные
 
Статус
Закрыто для дальнейших ответов.