2013-08-30 3 views
2

У меня есть gridview, который я использую для обновления базы данных. Сетка состоит из трех столбцов. Первый столбец - это идентификационный номер. Вторая колонка - это категория (BU). Конечный столбец - поле комментариев. У меня есть настройка редактирования, позволяющая редактировать второй и третий столбцы. Во втором столбце должен быть выпадающий список для выбора пользователем. Я делаю это хорошо. Мой клиент добавил к этому другую группу, поэтому запрос, который заполняет раскрывающийся список, необходимо изменить, чтобы определить, является ли клиент cust A или cust B. Я основываю выпадающий список на представлении в базе данных. Представление имеет два столбца Cust, BU. Я могу получить cust из исходного запроса, который заполняет gridview. Я попытался установить его как DataKey, но я не уверен, как ссылаться на него.Фильтр dropdownlist в gridview на основе параметра формы

Вот код для раскрывающегося списка в gridview. Объект привязан к GridView с использованием onrowdatabound = «RowDataBound»

Вот код RowDataBound за:

protected void RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow && gvSummary.EditIndex == e.Row.RowIndex) 
    { 

     DropDownList dlBU = (DropDownList)e.Row.FindControl("dlBU"); 

     string query = "select distinct Unit from vw_BU"; 
     SqlCommand cmd = new SqlCommand(query); 
     dlBU.DataSource = GetData(cmd); 
     dlBU.DataTextField = "Unit"; 
     dlBU.DataValueField = "Unit"; 
     dlBU.DataBind(); 
     dlBU.Items.FindByValue((e.Row.FindControl("lblBU") as Label).Text).Selected = true; 
    } 
} 

lblBU так, что DropDownList сохранит исходное значение, если таковые имеются. Я добавил значение null в базу данных для каждого клиента, так что, если значение не было введено, я избегаю ошибки.

Так что в конечном итоге я хочу, чтобы выделить отдельный блок из vw_BU, где cust = «Tim», и я бы получил Tim от datakey в исходном select-заявлении.

Надеюсь, это имеет смысл.

+0

Вы сказали, что вы можете получить Cust из исходного запроса выбора, который заполняет GridView. Пожалуйста, покажите полный запрос, который используется для заполнения GridView. –

+0

Я использую BindData() для обновления gridview. Вот код для функции private Void BindData() { string query = "select [AnnotationNumber], [BusinessUnit] как Unit, AnnotationComments, cust from vw_GridviewSource"; SqlCommand cmd = новый SqlCommand (запрос); gvSummary.DataSource = GetData (cmd); gvSummary.DataBind(); ' } –

+0

Сброс непосредственно перед тем, как из vw_GridviewSource я получаю имя клиента.Он будет согласован в рамках одного gridview, потому что gridview основан на двух параметрах. –

ответ

2

Примечание: Проверка GridView.EditIndex в OnRowCommand всегда будет иметь свое значение как -1 и, следовательно, проверка gvSummary.EditIndex==e.Row.RowIndex никогда не будет true.

Вы должны поместить код в OnRowEditing событие вашего gridview, а не OnRowCommand. Начните с установки свойства DataKeyNames вашего вида сетки.

<asp:GridView ID="gvSummary" DataKeyNames="Cust" ... /> 

В вашем OnRowEditing случае, вы можете получить доступ к этому Cust значение строки для редактирования.

<asp:GridView ID="gvSummary" DataKeyNames="Cust" 
    OnRowEditing="gvSummary_RowEditing" ... /> 

// И ваш код позади будет ..

protected void gvSummary_RowEditing(object sender, GridViewEditEventArgs e) 
{ 

     // Get the Cust column value 
     string _custName= gvSummary.DataKeys[e.NewEditIndex].Value.ToString(); 
     // get the value without using DataKeys as: 
     string _custName2= gvSummary.Rows[e.NewEditIndex].Cells[2].Text; 
     // frame your query now:: 
     string query = "select distinct Unit from vw_BU where Cust='"+_custName+"'"; 

     // rest of your code to bind dropdownlist 

} 

EDIT :: В случае, если вы установили более одного столбцов в качестве ключевых полей, вы можете получить доступ к значениям как:

// using Names 
    string str = gvSummary.DataKeys[e.NewEditIndex].Values["Cust"].ToString(); 
    // using index 
    string str = gvSummary.DataKeys[e.NewEditIndex].Values[2].ToString(); 
+0

У меня проблема. Когда я помещаю строку _custName ... она не находит e.NewEditIndex, поэтому я не могу получить значение в строке, а затем получаю нулевой ответ на запрос. Он будет принимать e.Row.RowIndex. ЕСЛИ у меня есть метка lblCust в этой строке, которая не видна, могу ли я просто ссылаться на это вместо> –

+0

Хорошо, теперь у меня она работает. Я изменил строку _CustName как gvSummary.DataKeys [e.Row.RowIndex] .Values ​​["Cust"]. ToString(); Это потому, что у меня есть два datakeys. Когда я отлаживал его, я обнаружил, что он помещает другое значение datakey в переменную Cust. Этот синтаксис делает его более конкретным относительно того, какой мне нужен datakey. На флопе ты оказал большую помощь, я очень ценю это. –

+0

Тим, рад узнать, что сейчас работает. Еще одна вещь, которую вы можете попробовать, это получить значение без использования DataKeys как: gvSummary.Rows [e.NewEditIndex] .Cells [2] .Text; , Кроме того, вы используете событие OnRowDataBound? затем попробуйте: gvSummary.Rows [e.Row.RowIndex] .Cells [2] .Text; –