private void btnJS_Click(object sender, EventArgs e)
{
//元素的DATASET
DataTable Phdt = (DataTable)this.gridControl1.DataSource;
DataTable dt1 = Phdt.Copy();
DataRow[] dr = dt1.Select("check=1");
//定义元素中数组
ArrayList al = new ArrayList();
string[,] strArray = new string[dr.GetLength(0), 3];
for (int a = 0; a < dr.GetLength(0); a++)
{
//对数组进行赋值,得出每个元素所需要的最大值。 a为元素循环的变量
al.Add(dr[a]["YS"].ToString());
strArray[a, 0] = dr[a]["YS"].ToString();
strArray[a, 1] = dr[a]["ysup"].ToString();
strArray[a, 2] = dr[a]["ysdown"].ToString();
}
//原料的DATASET
DataTable Yhdt = (DataTable)this.gridControl2.DataSource;
//DATASET复制
DataTable dt2 = Yhdt.Copy();
DataTable dthl = Yhdt.Copy();
// weight为要生产的重量
double weight = double.Parse(this.spinEdit1.Text.ToString());
// parambc为步长
double parambc = double.Parse(this.spinEdit2.Text.ToString());
// c为原料在DATASET里的index,可以取到各个原料含量的值
int c = 0;
// dsfh 为计算后生成动态的列
DataTable dtfh = new DataTable();
dtfh = SetColumn(dtfh, "System.Int32", "ID", true, "序号", false);
dtfh = SetColumn(dtfh, "System.Boolean", "check", false, "选择", false);
for (int i = 0; i < dt2.Rows.Count; i++)
{
if (dt2.Rows[i].RowState != DataRowState.Deleted)
{
if (dt2.Rows[i][25].ToString().ToLower() == "false")
{
dtfh = SetColumn(dtfh, "System.Double", dt2.Rows[i]["原料编号"].ToString() + "|" + dt2.Rows[i]["批号"].ToString(), false, dt2.Rows[i]["原料名称"].ToString(), false);
dthl.Rows[i].Delete();
}
else
{
dt2.Rows[i].Delete();
}
}
}
dthl.AcceptChanges();
dt2.AcceptChanges();
for (int j = 6; j < 23; j++)
{
dtfh = SetColumn(dtfh, "System.Decimal", dt2.Columns[j].ColumnName.ToString(), false, "含" + dt2.Columns[j].ColumnName.ToString() + "量", false);
}
dtfh = SetColumn(dtfh, "System.Double", "Feiyong", false, "费用", false);
this.gridControl3.DataSource = this.gcdHL.DataSource;
gridControl4.MainView.PopulateColumns();
this.gridControl3.DataSource = dthl;
gridControl3.MainView.PopulateColumns();
FormatGridView(gridView7, 6);
gridView7.Columns[5].DisplayFormat.FormatType = DevExpress.Utils.FormatType.Numeric;
gridView7.Columns[5].DisplayFormat.FormatString = "C";
string[,] strc = new string[dt2.Rows.Count, 2];
// 进入递归计算部分
dtfh = GetFor(dt2, dtfh, weight, c, weight, parambc, strc, strArray);
// 绑定dtfh列表
this.gridControl4.DataSource = dtfh;
gridControl4.MainView.PopulateColumns();
FormatGridView(gridView8, dt2.Rows.Count + 2);
gridView8.Columns[dt2.Rows.Count + 19].DisplayFormat.FormatType = DevExpress.Utils.FormatType.Numeric;
gridView8.Columns[dt2.Rows.Count + 19].DisplayFormat.FormatString = "C";
// 按钮状态的改变
btnNext_Click(sender, e);
}
private void FormatGridView(DevExpress.XtraGrid.Views.Grid.GridView dgv, int parmInt)
{
dgv.Columns[0].Width = 50;
dgv.Columns[1].Width = 50;
for (int i = parmInt; i < parmInt + 17; i++)
{
dgv.Columns[i].DisplayFormat.FormatType = DevExpress.Utils.FormatType.Numeric;
dgv.Columns[i].DisplayFormat.FormatString = "p";
}
}
/// <summary>
/// 配料计算函数
/// </summary>
/// <param name="dt2">原料的dataset</param>
/// <param name="dtfh">计算后保存的dataset</param>
/// <param name="paramB">原料初始投量</param>
/// <param name="paramC">原料的index</param>
/// <param name="paramweight">重量</param>
/// <param name="parambc">步长</param>
/// <param name="strc">存入现在循环中的重量值</param>
/// <returns>Dataset</returns>
private DataTable GetFor(DataTable dt2, DataTable dtfh, double paramB, int paramC, double paramweight, double parambc, string[,] strc, string[,] strArray)
{
// 每次子循环paramC+1
paramC++;
// 第一个先进行循环
for (double i = paramB; i > 0; i = i - parambc)
{
// 把循环中的重量记录到strc数组中
strc[paramC - 1, 0] = (paramC - 1).ToString();
strc[paramC - 1, 1] = i.ToString();
// tt为总数
double tt = 0;
// 之前循环的总量
double hyl = 0;
for (int x = 0; x < strc.GetLength(0); x++)
{
if (strc[x, 1] == null)
{
strc[x, 1] = "0";
}
tt += double.Parse(strc[x, 1]);
if (x < paramC)
{
hyl += double.Parse(strc[x, 1]);
}
}
// 看循环的重量是否等于要生产的重量,相等的话直接进行计算。
if (tt != paramweight)
{
// 看循环是否是最后一个,是就退出'总重量不相等',否进行继续循环
if (paramC < dt2.Rows.Count)
{
// 递归循环
GetFor(dt2, dtfh, paramweight - hyl, paramC, paramweight, parambc, strc, strArray);
}
else
{
strc = null;
break;
}
}
else
{
// 是否新增一行的标志
bool flag = false;
// 元素的含量进行判断
bool ysflag = true;
// 新增一行
DataRow row = dtfh.NewRow();
row["ID"] = dtfh.Rows.Count + 1;
// 进行判断
// 定义多少种元素
string[,] ysnums = new string[17, 2];
// m为原料中元素名称的起始值
for (int m = 6; m < 23; m++)
{
// 元素名称
ysnums[m - 6, 1] = dt2.Columns[m].ColumnName.ToString();
for (int y = 0; y < dt2.Rows.Count; y++)
{
if (ysnums[m - 6, 0] != null)
{
// 元素的总重量
ysnums[m - 6, 0] = (double.Parse(dt2.Rows[y][m].ToString()) * double.Parse(strc[y, 1]) + double.Parse(ysnums[m - 6, 0].ToString())).ToString();
}
else
{
ysnums[m - 6, 0] = (double.Parse(dt2.Rows[y][m].ToString()) * double.Parse(strc[y, 1])).ToString();
}
}
row[ysnums[m - 6, 1]] = Math.Round(double.Parse(ysnums[m - 6, 0].ToString()) / paramweight, 2).ToString();
// 判断含量是否合格
for (int w = 0; w < strArray.GetLength(0);w++ )
{
if (strArray[w,0].ToString() == (ysnums[m - 6, 1].ToString()))
{
if (double.Parse(row[ysnums[m - 6, 1]].ToString()) > double.Parse(strArray[w, 2].ToString()) || double.Parse(row[ysnums[m - 6, 1]].ToString()) < double.Parse(strArray[w, 1].ToString()))
{
ysflag = false;
// 不符合退出 不再进行循环
break;
}
else
{
ysflag = true;
}
}
if (!ysflag)
{
// 不符合退出 不再进行循环
break;
}
}
if (!ysflag)
{
// 不符合退出 不再进行循环
break;
}
}
if (ysflag)
{
// 费用
double money = 0;
// 进行库存比较,费用计算,原料名称的循环含量显示
for (int k = 0; k < strc.GetLength(0); k++)
{
// 原料名称的循环含量
row[k + 2] = Math.Round(double.Parse(strc[k, 1].ToString()), 2);
// 库存是否参与计算
if (this.chkKC.Checked)
{
if (double.Parse(dt2.Rows[k]["原料重量"].ToString()) >= double.Parse(strc[k, 1].ToString()))
{
flag = true;
}
else
{
flag = false;
break;
}
}
else
{
flag = true;
}
money += double.Parse(dt2.Rows[k]["单价"].ToString()) * double.Parse(strc[k, 1].ToString());
}
// 费用的添加
row["Feiyong"] = Math.Round(money, 2).ToString();
// 如果参与计算的库存量比较少的话就不添加行
if (flag)
{
dtfh.Rows.Add(row);
}
}
}
}
return dtfh;
}
/// <summary>
/// 设置动态的列
/// </summary>
/// <param name="myTable">DataTable</param>
/// <param name="paramType">数据类型</param>
/// <param name="paramColumn">列名</param>
/// <param name="paramReadOnly">是否只读</param>
/// <param name="paramName">列名描述</param>
/// <param name="paramDefaultValue">false</param>
/// <returns></returns>
private DataTable SetColumn(DataTable myTable, string paramType, string paramColumn, bool paramReadOnly, string paramName, bool paramDefaultValue)
{
DataColumn mydatacolumn = new DataColumn();
mydatacolumn.DataType = System.Type.GetType(paramType);
mydatacolumn.ColumnName = paramColumn;
mydatacolumn.ReadOnly = paramReadOnly;
mydatacolumn.Expression = "";
mydatacolumn.Caption = paramName;
mydatacolumn.DefaultValue = paramDefaultValue;
myTable.Columns.Add(mydatacolumn);
return myTable;
}