2016-01-20 5 views
2

Это задавали много раз, но я не могу найти прямой ответ.C#, Удалить первую строку из элемента gridview

Используя C#, я использую datatable для заполнения сетки. Первая строка моего datatable содержит заголовки таблиц, поэтому я просматриваю эту строку и заполняю строку заголовка gridview. Но теперь мне нужно избавиться от этой первой строки (строки заголовка) в таблице. Я смотрел на всем протяжении, и все источники согласны, что правильный синтаксис:

strSQL = "SELECT * FROM [Station ID Request$]"; 
    OleDbDataAdapter adaBatch = new OleDbDataAdapter(strSQL, strConnExcel); 
    DataTable dtBatch = new DataTable(); 
    adaBatch.Fill(dtBatch); 
    gv_stations.DataSource = dtBatch; 
    gv_stations.DataBind(); 
    // Fill gridview headers with first row of data (spreadsheet headers) 
    int i = 0; 
    foreach (DataColumn col in dtBatch.Columns) 
    { 
     gv_stations.HeaderRow.Cells[i].Text = dtBatch.Rows[0][i].ToString(); 
     i++; 
    } 
    // Remove the first line of the gridview (contains header info) 
    gv_stations.DeleteRow(0); 

Все работает, но в последней строке, которая дает мне эту ошибку:

System.Web.HttpException (0x80004005): The GridView 'gv_stations' fired 
event RowDeleting which wasn't handled. at 
System.Web.UI.WebControls.GridView.OnRowDeleting(GridViewDeleteEventArgs e) 
at System.Web.UI.WebControls.GridView.HandleDelete(GridViewRow row, Int32 
rowIndex) at System.Web.UI.WebControls.GridView.DeleteRow(Int32 rowIndex) 

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

EDIT: Вот мой объект gridview, как и требовалось.

<asp:GridView ID="gv_stations" runat="server" 
    AutoGenerateColumns="True"  
    CssClass="c_gvv c_gvv_stations_results" 
    style="white-space:nowrap;"> 
</asp:GridView> 
+0

Почему вы добавляете строку заголовка только для ее удаления? – sr28

+0

Потому что мне нужна эта информация для заполнения строк заголовка. – buckshot

+0

Итак, вы хотите заполнить строку заголовка gridview, это то, что вы пытаетесь достичь? – sr28

ответ

2

Прочитав ваши комментарии к другим ответам я немного смущенный тем, о чем вы говорите, проблема. Может быть, если вы просто привязываетесь к gridview, первая строка в таблице данных (заголовки) отображается как строка заголовка, так и первая строка данных в gridview?

Кажется странным, что если вы не хотите, чтобы строка заголовка вы ее сначала извлекли, а затем перешли через сложность добавления всего этого в ваш цикл foreach, чтобы затем попробовать и удалить его.

Если вы не хотите, чтобы строка заголовка была выбрана в первую очередь, вы можете изменить строку подключения (предположительно, strConnExcel?), Чтобы включить «HDR = No», что не позволит ей вернуть первую строку в первый место.

Однако, если вы хотите, чтобы строка заголовка использовала «HDR = Yes» и просто привязывалась к вашему gridview. Он будет знать, что такое строка заголовка. Глядя на то, что вы делаете, хотя похоже, что вы пытаетесь добавить строку заголовка, а затем удалить его !?

+0

Я хочу, чтобы первая строка таблицы данных отображалась в заголовках столбцов. Тогда мне нужно избавиться от него в самой таблице. Я не понимаю «HDR = Да» ... что это? – buckshot

+0

sr28, вы решили мою проблему. Я не понимал свойства HDR, но я просто искал его, и да, это была моя проблема. Большая часть моего кода была обходным способом для чего-то, чего я не понимал. Благодарю. – buckshot

+0

@buckshot - без проблем. Иногда лучше объяснить, какова общая цель, а не конкретная проблема. Таким образом, люди могут предложить альтернативы вашему текущему подходу. – sr28

2

Вы пытаетесь удалить строку из GridView, а вы должны удалить его из DataTable. Используйте эту строку:

dtBatch.Rows[0].Delete(); 

Вместо этого:

gv_stations.DeleteRow(0); 

Вы также можете просто ваш цикл:

for(int i = 0; i < dtBatch.Columns.Count; i++) 
    gv_stations.HeaderRow.Cells[i].Text = dtBatch.Rows[0][i].ToString(); 

Полный код:

... 
//Fill gridview headers with first row of data (spreadsheet headers) 
for(int i = 0; i < dtBatch.Columns.Count; i++) 
    gv_stations.HeaderRow.Cells[i].Text = dtBatch.Rows[0][i].ToString(); 

//Remove the first line of the gridview (contains header info) 
dtBatch.Rows[0].Delete(); 

//now do the bindings 
gv_stations.DataSource = dtBatch; 
gv_stations.DataBind(); 
+0

Shaharyar, мне нужна эта первая строка, потому что она содержит мои заголовки сетки. Как только gridview привязано, я прохожу через первую строку, чтобы назвать заголовки столбцов. В этот момент удаление строки из datatable не помогает мне. Я попытался удалить первую строку, а затем перестроить gridview, но заголовки все обновлены до значения по умолчанию. Спасибо за ваш ответ, но это не сработает. – buckshot

+0

Пожалуйста, добавьте ваш код aspx к вашему вопросу. – Shaharyar

+0

Спасибо за ваше редактирование с полным кодом - это был мой оригинальный подход, но он тоже не работает. Цикл, который заполняет строку заголовка, не работает на gridview, который не был связан. Сначала мне нужно связать его, а затем обновить заголовки. Не знаю, почему. – buckshot

0

Вы привязываете GridView к источнику данных:

gv_stations.DataSource = dtBatch; gv_stations.DataBind();

Либо удалите его из источника данных, а затем databind или databind и удалите его из gridview без повторной привязки.

Или, если вы хотите, чтобы держать его там, Вы можете сделать его невидимым:

gv_stations.rows [0] .Visible = ложь

+1

Мне нужно связать его, прежде чем я установлю заголовки; и ваше предложение, «удалите его из gridview без redatabinding». это то, что я пытался сделать. Тем не менее, ваше предложение о том, чтобы сделать этот невидимый ряд работал как шарм, спасибо большое. – buckshot

Смежные вопросы