F-ES Sitecore
Если вы отладите свой код, то поймете, почему он не работает. Вы предполагаете, что ячейка представления сетки для элемента без данных является пустой строкой, но, вероятно, это не так (иначе ваш код будет работать). В зависимости от используемого шаблона могут быть новые строки или неразрывные пробелы. Поставьте точку останова на коде и проверьте фактическое значение
rw.Cells[1]
и вы обнаружите, что это не то, что вы ожидаете.
Во всяком случае, проверка выходных данных gridview-это неправильный способ закрепить это, вы можете управлять видимостью строки на базовых данных, а не тем, как эти данные отображаются в html. Как вы это сделаете, зависит от того, что вы привязываете к своей строке, но вы хотите использовать событие RowDataBound, которое запускается для каждой строки, и в этом случае запрашивать базовые данные для строки и выяснять, видна ли строка.
Мой gridview
<asp:GridView ID="MyGridView" runat="server" AutoGenerateColumns="true" OnRowDataBound="MyGridView_RowDataBound">
</asp:GridView>
Это делается для привязки DataTable
protected void Page_Load(object sender, EventArgs e)
{
DataTable data = new DataTable();
data.Columns.Add("ID", typeof(int));
data.Columns.Add("Name", typeof(string));
data.Rows.Add(1, "John");
data.Rows.Add(2, "");
data.Rows.Add(3, "Dave");
// you can set this event in code behind like below if you don't want to use the
// OnRowDataBound attribute on the asp:GridView
// MyGridView.RowDataBound += MyGridView_RowDataBound;
MyGridView.DataSource = data;
MyGridView.DataBind();
}
protected void MyGridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
// This event if fired for all template types (header, data, footer etc)
// but we're only interested in the data rows so if this isn't a data
// row exit the event
if (e.Row.RowType != DataControlRowType.DataRow)
{
return;
}
// cast e.Row.DataItem to the underlying data type
DataRowView data = (DataRowView)e.Row.DataItem;
// check that data for empty values
if (string.IsNullOrWhiteSpace((string)data["Name"]))
{
e.Row.Visible = false;
}
}
Или если вы привязываетесь к списку объектов
public class MyData
{
public int ID { get; set; }
public string Name { get; set; }
}
protected void Page_Load(object sender, EventArgs e)
{
List<MyData> data = new List<MyData>();
data.Add(new MyData { ID = 1, Name = "John" });
data.Add(new MyData { ID = 2, Name = "" });
data.Add(new MyData { ID = 3, Name = "Dave" });
// you can set this event in code behind like below if you don't want to use the
// OnRowDataBound attribute on the asp:GridView
// MyGridView.RowDataBound += MyGridView_RowDataBound;
MyGridView.DataSource = data;
MyGridView.DataBind();
}
protected void MyGridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
// This event if fired for all template types (header, data, footer etc)
// but we're only interested in the data rows so if this isn't a data
// row exit the event
if (e.Row.RowType != DataControlRowType.DataRow)
{
return;
}
// cast e.Row.DataItem to the underlying data type
MyData data = (MyData)e.Row.DataItem;
// check that data for empty values
if (string.IsNullOrWhiteSpace(data.Name))
{
e.Row.Visible = false;
}
}