c# - tag - ¿Cómo evitar el código repetido?
summary c# (7)
¿Qué tal algo como:
void FillData(DataTable dataSource, DropDownList ddl, string dataValueField, string dataTextField)
{
ddl.DataSource = dt;
ddl.DataValueField = dataValueField;
ddl.DataTextField = dataTextField;
ddl.DataBind();
}
Entonces puedes llamarlo como:
FillData(DB.GetTradeSetups(), ddlSetups, "tradeSetupId", string.Empty)
Todavía soy bastante nuevo en programación y noté que estoy repitiendo el código:
protected void FillTradeSetups()
{
DBUtil DB = new DBUtil();
DataTable dtTradeSetups;
dtTradeSetups = DB.GetTradeSetups();
ddlSetups.DataValueField = "tradeSetupId";
ddlSetups.DataSource = dtTradeSetups;
ddlSetups.DataBind();
}
protected void FillTimeFrames()
{
DBUtil DB = new DBUtil();
DataTable dtTimeFrames;
dtTimeFrames = DB.GetTimeFrames();
ddlTimeFrames.DataValueField = "tfCode";
ddlTimeFrames.DataSource = dtTimeFrames;
ddlTimeFrames.DataBind();
}
protected void FillTradeGrades()
{
DBUtil DB = new DBUtil();
DataTable dtTradeGrades;
dtTradeGrades = DB.GetTradeGrades();
ddlTradeGrades.DataValueField = "tradeGrade";
ddlTradeGrades.DataTextField = "descr";
ddlTradeGrades.DataSource = dtTradeGrades;
ddlTradeGrades.DataBind();
}
protected void FillExecutionGrades()
{
DBUtil DB = new DBUtil();
DataTable dtExecutionGrades;
dtExecutionGrades = DB.GetExecutionGrades();
ddlExecutionGrades.DataValueField = "executionGrade";
ddlExecutionGrades.DataTextField = "descr";
ddlExecutionGrades.DataSource = dtExecutionGrades;
ddlExecutionGrades.DataBind();
}
¿Cómo puedo ser un poco más inteligente sobre esto? ¿Puedes ayudarme a reescribir el código para que no se repita tanto?
ACTUALIZAR
Wow, gracias por las respuestas, pensé en publicar lo que estoy pensando en implementar. También me creé otro pequeño trabajador para eliminar algún otro código duplicado feo. ¿Qué piensas de esto?
void FillDropDownList(DropDownList ddl, DataTable dt, string dataValueField, string dataTextField, string defValue)
{
ddl.DataValueField = dataValueField;
ddl.DataSource = dt;
if (!string.IsNullOrEmpty(dataTextField))
{
ddl.DataTextField = dataTextField;
}
ddl.DataBind();
ddl.SelectedValue = defValue;
}
private string GetTradeItem(DataTable tradeDetails, string attribute)
{
return tradeDetails.Rows[0][attribute].ToString();
}
y luego llámalo con algo como:
int tradeId = int.Parse(Request.QueryString["tradeId"]);
DBUtil DB = new DBUtil();
DataTable tradeDetails = DB.GetTrade(tradeId);
FillDropDownList(ddlTradeGrades, DB.GetTradeGrades(), "tradeGrade", "descr", GetTradeItem(tradeDetails, "tradeGrade"));
La codificación se siente bien cuando algo feo se convierte en algo más elegante.
Algo como esto, tal vez?
void SetupDataSource(DropDownList ddl, DataTable dt, string dataValueFieldm, string dataTextField)
{
if (ddl != null)
{
ddl.DataValueField = dataValueField;
ddl.DataSource = dt;
if (!string.IsNullOrEmpty(dataTextField))
{
ddl.DataTextField = dataTextField;
}
ddl.DataBind();
}
else
{
throw new ArgumentNullException("ddl");
}
}
Crea un método que establezca las cosas que deseas:
void SetValues(DropDownList ddl, string datavalue, string text, object ds)
{
ddl.DataValueField = dataValue;
ddl.DataTextField = text;
ddl.DataSource = ds;
ddl.DataBind();
}
Entonces puedes llamarlo con:
SetValues(ddlTradeGrades, "tradeGrade", "descr", dtTradeGrades);
FWIW, tal vez algo como:
void BindControl(DropDownList ddl, string valueField, string textField, DataTable data) {
ddl.DataValueField = valueField;
ddl.DataTextField = textField ?? valueField; // textField can be null
ddl.DataSource = data;
ddl.DataBind();
}
DBUtil DB = new DBUtil();
BindControl(ddlTradeGrades, "tradeGrade", "descr", DB.GetTradeGrades());
...
Sin embargo, esa plomería no está terriblemente duplicada por sí misma y se debe considerar la facilidad de futuras modificaciones / mantenimiento.
Feliz codificacion
Puede ser así ...
protected void FillDdl(DropDownList ddl, string dataValueField, Func<DataTable> dataTableMethod)
{
FillDdl(ddl, dataValueField, null, dataTableMethod);
}
protected void FillDdl(DropDownList ddl, string dataValueField, string dataTextField, Func<DataTable> dataTableMethod)
{
DataTable dt = dataTableMethod();
ddl.DataSource = dt;
ddl.DataValueField = dataValueField;
ddl.DataTextField = dataTextField ?? dataValueField;
ddl.DataBind();
}
y luego llamar directamente así
DBUtil DB = new DBUtil();
FillDdl(ddlSetups, "tradeSetupId", DB.GetTradeSetups);
FillDdl(ddlTimeFrames, "tfCode", DB.GetTimeFrames);
FillDdl(ddlTradeGrades, "tradeGrade", "descr", DB.GetTradeGrades);
FillDdl(ddlExecutionGrades, "executionGrade", "descr", DB.GetExecutionGrades);
o todavía podría tener métodos individuales flacos
protected void FillTradeSetups()
{
DBUtil DB = new DBUtil();
FillDdl(ddlSetups, "tradeSetupId", DB.GetTradeSetups);
}
protected void FillTimeFrames()
{
DBUtil DB = new DBUtil();
FillDdl(ddlTimeFrames, "tfCode", DB.GetTimeFrames);
}
protected void FillTradeGrades()
{
DBUtil DB = new DBUtil();
FillDdl(ddlTradeGrades, "tradeGrade", "descr", DB.GetTradeGrades);
}
protected void FillExecutionGrades()
{
DBUtil DB = new DBUtil();
FillDdl(ddlExecutionGrades, "executionGrade", "descr", DB.GetExecutionGrades);
}
Puedes hacer algo como esto:
private void BindMyLists()
{
DBUtil DB = new DBUtil();
BindDropDownList(this.ddlExecutionGrades, DB.GetExecutionGrades(), "executionGrade", "descr");
BindDropDownList(this.ddlTradeGrades, DB.GetTradeGrades(), "tradeGrade", "descr");
//etc
}
protected void BindDropDownList(DropDownList dropDownList, DataTable dataTable, string dataValueField, string dataTextField)
{
dropDownList.DataValueField = dataValueField;
dropDownList.DataTextField = dataTextField;
dropDownList.DataSource = dataTable;
dropDownList.DataBind();
}