Как избежать повторного кода?
Я по-прежнему новичок в программировании, и я заметил, что повторяю код:
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();
}
Как я могу быть немного умнее об этом? Можете ли вы помочь мне переписать код, чтобы он не повторял так много?
UPDATE
Ничего себе, спасибо за ответы, я думал, что опубликую то, что я думаю о внедрении. Я также создал себе другого маленького работника, чтобы удалить еще один уродливый дублированный код. Что вы думаете об этом?
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();
}
а затем назовите его чем-то вроде:
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"));
Кодирование прекрасно себя чувствует, когда что-то уродливое превращается в нечто более элегантное.
Ответы
Ответ 1
Что-то вроде этого, может быть?
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");
}
}
Ответ 2
FWIW, возможно, что-то вроде:
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());
...
Тем не менее, эта сантехника не ужасно дублируется сама по себе, и следует учитывать облегчение будущих модификаций/обслуживания.
Счастливое кодирование.
Ответ 3
Создайте метод, который задает нужные вам вещи:
void SetValues(DropDownList ddl, string datavalue, string text, object ds)
{
ddl.DataValueField = dataValue;
ddl.DataTextField = text;
ddl.DataSource = ds;
ddl.DataBind();
}
Затем вы можете вызвать его с помощью:
SetValues(ddlTradeGrades, "tradeGrade", "descr", dtTradeGrades);
Ответ 4
Как насчет чего-то типа:
void FillData(DataTable dataSource, DropDownList ddl, string dataValueField, string dataTextField)
{
ddl.DataSource = dt;
ddl.DataValueField = dataValueField;
ddl.DataTextField = dataTextField;
ddl.DataBind();
}
Затем вы можете вызвать его так:
FillData(DB.GetTradeSetups(), ddlSetups, "tradeSetupId", string.Empty)
Ответ 5
Вы можете сделать что-то вроде этого:
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();
}
Ответ 6
См. Требуется универсальная утилита С# для заполнения ASP.NET DropDownList
Ответ 7
Может быть так...
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();
}
а затем вызовите прямо так:
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);
или у вас все еще могут быть тощие индивидуальные методы
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);
}