Я работаю над проектом. У меня есть gridview с одним столбцом, имеющим флажок. Теперь я хочу заполнить свой gridview данными и установить / снять флажки соответственно в зависимости от моего поля статуса. До сих пор я обрабатываю это в событии привязки строки gridview. Но я просто хочу знать, есть ли способ установить флажки при привязке источника.

Запрос, который я выполняю, чтобы получить данные в gridview

select s.studentcode,s.studentname,r.status from tblstudent s join tblresults r on s.studentcode=r.studentcode

Вывод я получаю

enter image description here

Теперь я хочу, чтобы если мой статус был «повышен», флажок был установлен, а если он «не повышен», флажок был снят. Я не хочу использовать метод привязки данных строки. Просто хочу, чтобы моя работа была завершена в следующих строках

 sql = "select s.studentcode,s.studentname,r.status from tblstudent s join tblresults r on s.studentcode=r.studentcode";
    ds = obj.openDataset(sql, Session["SchoolCode"].ToString());
    if (ds.Tables[0].Rows.Count > 0)
    {
        grdstudents.DataSource = ds;
        grdstudents.DataBind();
        grdstudents.Visible = true;
    }
    else
    {
        alertdiv.Visible = true;
        lblalertmsg.Visible = true;
        btnclose.Visible = true;
        lblalertmsg.Text = "No Record found";
    }

Решение

Запрос

select s.studentcode,s.studentname,if(r.status='Promoted',true,false) as status from tblstudent s left join tblresults r on s.studentcode=r.studentcode where s.classcode='10000'

grdstudents.DataSource = ds;// note we binded to final table
grdstudents.DataBind();

Поле флажка на странице aspx внутри gridview:

<ItemTemplate>
               <asp:CheckBox ID="chkapply" runat="server" Checked='<%# Convert.ToBoolean(Eval("status"))%>'/>
           </ItemTemplate>

Это решение поможет вам избежать написания лишнего кода при использовании событий итембиндинга или привязки данных строки в gridview.

1
rupinder18 5 Мар 2014 в 11:37

2 ответа

Лучший ответ

Флажки можно отмечать / снимать только с помощью логических значений. в этом случае, потому что Column: 'status' не представляет логических значений, поэтому прямая привязка данных не будет служить этой цели.

Вам нужно выполнить два шага:

Шаг 1.) Скопируйте исходные данные в новую таблицу и измените тип данных столбца «статус» на логический.

Шаг 2.) Измените данные в столбце статуса в итоговой таблице, используя данные исходной таблицы.

Шаг 1:

ds = obj.openDataset(sql, Session["SchoolCode"].ToString());
DataTable dtOriginalTable = ds.Tables[0];
DataTable dtFinalTable = new DataTable();
foreach (DataColumn dc in dtOriginalTable.Columns)
{
dtFinalTable.Columns.Add(dc.ColumnName);
}
foreach (DataColumn dc in dtFinalTable.Columns)
{
           if (dc.ColumnName == "status")
               dc.DataType = System.Type.GetType("System.Boolean");
}

Шаг 2 ниже ::

foreach (DataRow drow in dtOriginalTable.Rows)
{
         if( drow["status"].ToString().Equals("Promoted"))
              drow["status"]="true";
         else
              drow["status"]="false"
// ADD the row to final table 
dtFinalTable.Rows.Add(drow.ItemArray);
}

Теперь выполните привязку к GridView как:

grdstudents.DataSource = dtFinalTable ;// note we binded to final table
grdstudents.DataBind();

ПРИМЕЧАНИЕ :: Почему требуется шаг 1? Потому что вы не можете изменить тип данных столбца после того, как он заполнен данными.

Также возникнет проблема с производительностью, если база данных содержит большое количество данных.

2
R.C 5 Мар 2014 в 09:42

Вам нужно использовать OnItemDataBoundEvent для сетки. Если вы не хотите использовать это событие. Затем вы можете просмотреть все строки сетки.

Если ваш идентификатор сетки - grid1, то переберите все строки в grid1.Rows. Вам нужно будет найти свой флажок в строке, а затем установить / снять флажок на основе ваших данных.

foreach (GridViewRow row in grid1.Rows)
{
   CheckBox checkBox1 = row.FindControl("checkBox1") as CheckBox;
   checkBox1.Checked = true; // based on condition

}
2
AbhinavRanjan 5 Мар 2014 в 08:49