Невозможно связать с датируемым без имени ошибки при фильтрации сетки
У меня есть datagridview
и 5 ComboBoxes
и я пытаюсь отфильтровать строки сетки с текстовыми значениями ComboBox. Сетка заполнена хранимой процедурой, зависит от некоторых условий в FormLoad
событие. Должен ли я заполнить его снова в btn_filter
событие клика?
В любом случае это исключение отлавливается в коде ниже: cannot bind to datatable with no name.
вот код для btn_filter
:
private void btnFilter_Click(object sender, EventArgs e)
{
String filterStr = "";
if (cmbGrp.Text.Trim() != String.Empty)
filterStr += "group ='" + cmbGrp.Text.Trim() + "' and";
if(cmbMdl.Text.Trim() != String.Empty)
filterStr += " model ='" + cmbMdl.Text.Trim() + "' and";
if (cmbTrh.Text.Trim() != String.Empty)
filterStr += " tarh ='" + cmbTrh.Text.Trim() + "' and";
if (cmbSiz.Text.Trim() != String.Empty)
filterStr += " size ='" + cmbSiz.Text.Trim() + "' and";
if (cmbClr.Text.Trim() != String.Empty)
filterStr += " color ='" + cmbClr.Text.Trim() + "'";
if (filterStr.LastIndexOf("and") == filterStr.Length - 3)
filterStr = filterStr.Remove(filterStr.Length-3,3);
DataView view = new DataView();
if (condition1)
view.Table = Production.usp1(txtProdCode.Text);
else if (condition2)
view.Table = Production.usp2();
else
return;
view.RowFilter = filterStr;
dgv.DataSource = view;
}
а вот хранимые процедуры, связанные функции (в Production
учебный класс):
public static DataTable usp2()
{
SqlCommand cmd = new SqlCommand("usp2");
return callProc(cmd);
}
public static DataTable usp1(String prod_code)
{
SqlCommand cmd = new SqlCommand("usp1");
cmd.Parameters.Add(new SqlParameter("@prod_code", prod_code));
return callProc(cmd);
}
2 ответа
Попробуйте указать Имя явно. использование DataTable.TableName="Name"
прежде чем создать свой dataview.
Ваш метод btnFilter_Click должен выглядеть так:
private void btnFilter_Click(object sender, EventArgs e)
{
String filterStr = "";
filterStr += "grp_name " + (cmbGrp.Text.Trim() == String.Empty ? " like '%'" : "='" + cmbGrp.Text.Trim()) + "'";
filterStr += " and mdl_name " + (cmbMdl.Text.Trim() == String.Empty ? " like '%'" : "='" + cmbMdl.Text.Trim()) + "'";
filterStr += " and trh_name " + (cmbTrh.Text.Trim() == String.Empty ? " like '%'" : "='" + cmbTrh.Text.Trim()) + "'";
filterStr += " and siz_name " + (cmbSiz.Text.Trim() == String.Empty ? " like '%'" : "='" + cmbSiz.Text.Trim()) + "'";
filterStr += " and clr_name " + (cmbClr.Text.Trim() == String.Empty ? " like '%'" : "='" + cmbClr.Text.Trim()) + "'";
DataView view = new DataView();
if (condition1)
{
var dt = Production.usp1(txtProdCode.Text);
dt.TableName="usp1";
view.Table = dt;
}
else if (condition2)
{
var dt = Production.usp2();
dt.TableName="usp2";
view.Table = dt;
}
else
return;
view.RowFilter = filterStr;
dgv.DataSource = view;
}
Чтобы не перезагружать сетку со значениями из БД снова, вы можете привести существующий источник данных к DataView следующим образом:
(dataGridViewFields.DataSource as DataTable).DefaultView.RowFilter
Подробнее в этом вопросе
Спасибо user1792936, способ, которым вы реализовали, верен, но есть более простой способ: по этой ссылке и ответу Брэда Брюса
Мне не нужно снова заполнять сетку:
(dgv.DataSource as DataTable).DefaultView.RowFilter = filterStr;