Какой рекомендуемый способ заполнить все элементы управления в веб-форме, когда пользователь выбирает запись?

У меня есть элемент управления GridView, который показывает список всех сотрудников. Когда пользователь выбирает любого сотрудника из этого списка, запись отображается в веб-форме со всеми элементами управления вводом, предварительно заполненными значениями.

Я хочу знать любой хороший подход для этого. Должен ли я связать все элементы управления вводом с любым SqlDataSource или я должен заново заполнить все элементы управления вводом, выбирая значения из DataSet.

 RKh18 июл. 2012 г., 05:26
@Peter Спасибо, я постараюсь вернуться к вам.
 Peter18 июл. 2012 г., 00:22
Как насчет использования FormView в режиме редактирования, который связан с SqlDataSource. SqlDataSource будет связан со свойством selectedvalue GridView. Выбор пользователя автоматически загрузит их в FormView. Если это будет приемлемым, я напишу это.

Ответы на вопрос(3)

Я использовал этот код в своем приложении

Лучший подход - это использовать этот методgridview_select_index_change() событие

 private void PickValues(int SerialNum) 
{ 
    DataSet ds = new DataSet(); 
    try 
    { 
        string Query = "SELECT * FROM tw_main WHERE sno = " + SerialNum; 
        ds = reuse.ReturnDataSet(Query, "Scheme"); 

        //Add Scheme Code to new Session Variable 
        Session.Add("SerialNumber", ds.Tables[0].Rows[0]["sno"].ToString()); 
        //Set Update Flag 
        TaskFlag = "UPDATE"; 

        //Fill values of selected record on the Entry Form 
        if (ds.Tables[0].Rows[0]["schm_code"].ToString().Length > 0) 
            lblSchemeCode.Text = ds.Tables[0].Rows[0]["schm_code"].ToString(); 

        ddlType.SelectedValue = ds.Tables[0].Rows[0]["schemetype"].ToString(); ddlDistrict.Text = ds.Tables[0].Rows[0]["dist_nm"].ToString(); ddlBlock.Text = ds.Tables[0].Rows[0]["block_nm"].ToString(); 
        txtSchemeName.Text = ds.Tables[0].Rows[0]["schm_nm"].ToString(); 
        txtPopulation2001.Text = ds.Tables[0].Rows[0]["population_2001"].ToString(); 
        txtSupplySource.Text = ds.Tables[0].Rows[0]["supply_source"].ToString(); 
        txtApprovalYear.Text = ds.Tables[0].Rows[0]["yr_approval"].ToString(); 
        txtApprovalLetterNum.Text = ds.Tables[0].Rows[0]["approval_letter_num"].ToString(); 
        txtApprovalAmount.Text = ds.Tables[0].Rows[0]["sch_apr_amt"].ToString(); 
        txtWaitedLetterNum.Text = ds.Tables[0].Rows[0]["sch_waited_details"].ToString(); 
        txtSchTransferLetterNum.Text = ds.Tables[0].Rows[0]["schm_trans_details"].ToString(); 
        txtSchTransferDate.Text = ds.Tables[0].Rows[0]["schm_trans_date"].ToString(); 
        txtOtherRemarks.Text = ds.Tables[0].Rows[0]["remarks"].ToString(); 
    } 
    catch (Exception ex) 
    { 
        ScriptManager.RegisterClientScriptBlock(this.Page, this.Page.GetType(), "Warning", "alert('" + ex.Message.ToString() + "');",true); 
    } 
    finally 
    { 
        ds.Dispose(); 
        gridSerialNo = 0; 
    } 
}

EDIT

Там может быть лучший подход для этого, но это работает, конечно, хорошо.

 RKh06 июл. 2012 г., 12:35
В любом случае, код, который вы разместили, - это мой код из одного из моих старых постов.
 RKh06 июл. 2012 г., 12:32
Вы предполагаете, что элементы управления заполнены через DataSet? Если да, где находится DataSet? В веб-форме?
 RKh06 июл. 2012 г., 11:01
Я также использую этот способ, но теперь я хочу поместить этот код в отдельный класс. Проблема в том, как передать имя элемента управления этому классу.
 06 июл. 2012 г., 11:49
зачем передавать контрольные имена. Просто передайте переменную набора данных методу того класса, который вы хотите вызвать

Я бы выполнил эту задачу, поскольку вы хотите создать слой доступа к данным - создать класс со всеми свойствами.

Учебный класс:

public class tw_main
{
     public string SchemeCode {get;set;}
}

DAL:

public class dal
{
  public tw_main getSelectedValue(pass the parameters required by the method)
  {
    //your connection and query code
    var twmain = new tw_main();
    twmain.SchemaCode =  ds.Tables[0].Rows[0]["schm_code"].ToString(); 

    return twmain;
  }
}

Страница интернета:

//depending upon where you add this a reference may need to be imported (using) to the namespace
  var dalObj = new dal();
  var tw = dalObj.getSelectedValue();
lblSchemeCode.Text = tw.SchemaCode;
Решение Вопроса

Сначала вы добавляете кнопку выбора в GridView как:

<asp:ButtonField Text="Select" CommandName="ViewMe" ButtonType="Button" />

Затем вы добавляетеOnRowCommand="RowCommand" собственность наGridView чтобы вызвать эту функцию, когда кнопка нажата и на код позади функции:

protected void RowCommand(object sender, GridViewCommandEventArgs e)
{
    // if the ViewMe command is fired
    if (e.CommandName == "ViewMe")
    {
        // go to find the index on the grid view
        int iTheIndexNow;
        if (int.TryParse(e.CommandArgument.ToString(), out iTheIndexNow))
        {
            // Set and highlight the selected
            TheGridView.SelectedIndex = iTheIndexNow;

            // do we have the table data id ?
            if (TheGridView.SelectedValue != null)
            {
                // now load the controls data using this id
                LoadValuesFromDatabaseToControls(TheGridView.SelectedValue);
            }    
        }
    }
}

Я предпочитаю такой способ командной кнопки, потому что вы можете добавить больше команд, чем выбрать, или отредактировать, даже удалить или скопировать ... просто изменение индекса может быть сделано по любой причине (например, путем изменения страницы), а также необходимо снова Выбрать.

Я использую дозвуковой 2 DAL для загрузки данных из базы данных. Пример кода из моих программ:

    void LoadValuesFromDatabaseToControls(string editID)
    {
        // Load it from database
        AthUserMaiListName OneRow = new AthUserMaiListName(editID);

        if (OneRow.IsNotExist)
        {
            // a custom control that show messages on top.
            uResult.addMsg("Fail to load id " + editID, MsgType.error);
            // close the view of the controls
            dbViewPanel.Visible = false;
        }
        else // else we have the data and go for show them
        {
          // show this panel that contains the controls.
          dbViewPanel.Visible = true;

          // I keep my current edit id
          lblID.Text = editID;

          // just be sure that the select exist on DrowDownList
          MyUtils.SelectDropDownList(ddlEventType, OneRow.CAddedFrom);

          txtEmail.Text = OneRow.CEmail;
          txtFirstName.Text = OneRow.CFirstName;
          txtLastName.Text = OneRow.CLastName;
          txtInsideTitle.Text = OneRow.CInsideTitle;
          txtCompanyName.Text = OneRow.CCompanyName;        

          txtCreated.Text = DateTimeRender(OneRow.CreatedOn);
          txtModified.Text = DateTimeRender(OneRow.ModifiedOn);
        }
   }
 06 июл. 2012 г., 19:11
@RPK Я обновил его.
 RKh06 июл. 2012 г., 12:31
Soory, я имею в виду WebForm, а не DropDown.
 RKh06 июл. 2012 г., 18:57
Я хочу видеть немного вашего кода.
 RKh06 июл. 2012 г., 12:37
Да, это исходит от DAL, но вы заполняете через DataSet, как только DAL заполняет этот DataSet?
 RKh06 июл. 2012 г., 11:02
Спасибо, я тоже так использую. Я просто хочу знать, как должен выглядеть метод заполнения DropDowns.

Ваш ответ на вопрос