2010-11-16 7 views
1

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

У меня есть, чтобы показать несколько gridviews на одной странице, и все эти данные заполняются динамически.

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

вот код. для .aspx страницы

<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder2" Runat="Server"> 
<asp:Panel ID="Panel1" runat="server" ScrollBars ="Auto" Height="500px" BorderColor="#003399" BorderWidth="3px"> 


</asp:Panel> 
</asp:Content> 

и вот код для .aspx.cs

for (int j = 0; j < 5; j++) 
     { 
      GridView Grid = new GridView(); 
      ArrayList machID = new ArrayList(); 
      ArrayList machName = new ArrayList(); 


      Grid.ID = machGrps[j].ToString(); 
      Grid.AllowSorting = true; 
      Grid.CellSpacing = 2; 
      Grid.GridLines = GridLines.None; 
      Grid.Width = Unit.Percentage(100); 

      DataTable dt = new DataTable(); 
      SqlConnection connection = new SqlConnection(Session["ConnectionStringSQL"].ToString()); 
      connection.Open(); 
      SqlCommand sqlCmd = new SqlCommand("select MachineID, MachineName from Machines", connection); 
      SqlDataAdapter sqlDa = new SqlDataAdapter(sqlCmd); 

      sqlDa.Fill(dt); 
      connection.Close(); 

      if (dt.Rows.Count > 0) 
      { 
       for (int i = 0; i < dt.Rows.Count; i++) 
       { 
        machID.Add(dt.Rows[i]["MachineID"].ToString()); 
        machName.Add(dt.Rows[i]["MachineName"].ToString()); 

       } 

       DataTable taskTable = new DataTable(); 
       taskTable.Columns.Add("MachineID"); 
       taskTable.Columns.Add("MachineName"); 

       if (machID.Count != 0) 
       { 
        for (int i = 0; i < machID.Count; i++) 
        { 
         DataRow tableRow = taskTable.NewRow(); 
         tableRow["MachineID"] = machID[i]; 
         tableRow["MachineName"] = machName[i]; 

         taskTable.Rows.Add(tableRow); 
        } 
       }     


       Session["TaskTable"] = taskTable; 

       Grid.DataSource = Session["TaskTable"]; 
       Grid.DataBind(); 

       Label label = new Label(); 
       label.Text = "Machine Grp" + Grid.ID; 
       Panel1.Controls.Add(label); 
       Panel1.Controls.Add(Grid); 

      } 
     } 

ПРИМЕЧАНИЕ ЭТОТ КОД НИЖЕ НЕ МОЖЕТ БЫТЬ СДЕЛАНО ANYMORE КАК Я заселить GridView НАПРЯМУЮ ИЗ ТАБЛИЦЫ:

Я использовал так, чтобы изменить это, когда ondatabound = «GridView1_DataBound», если вызывается с .aspx-страницы

Код кода привязки выглядит так:

protected void GridView1_DataBound(object sender, EventArgs e) 
    { 
     foreach (GridViewRow myRow in GridView1.Rows) 
     { 

      //this is where ID is stored in an label template 
      Label Label3 = (Label)myRow.FindControl("Label3"); 
      int val = Convert.ToInt32(Label3.Text); 

      Image Image5 = (Image)myRow.FindControl("Image5"); 
      if (Convert.ToInt32(Label3.Text) < 0) 
      { 
       Image5.ImageUrl = "~/NewFolder1/warning_16x16.gif"; 
      } 
      else 
      { 
       Image5.ImageUrl = "~/NewFolder1/1258341827_tick.png"; 
      } 
     } 

    } 

ответ

3

две вещи:

protected void GridView1_DataBound(object sender, EventArgs e) { 
    foreach (GridViewRow myRow in GridView1.Rows) { 
     // blah blah blah code goes here 
    } 
} 

должен быть

//now e is a 
protected void Grid_RowDataBound(object sender, GridViewRowEventArgs e) { 
    if (e.Row.RowType == DataControlRowType.DataRow) { 
     // blah blah blah, this lets you work on one row at a time. 
     // since the framework does this per row, you don't need to parse the gridview 
     // yourself, altho you're more than welcome to. 
     // But you can get more control this way. I promise. 
     Label Label3 = (Label)e.Row.FindControl("Label3"); 
     int val = Convert.ToInt32(Label3.Text); 

     Image Image5 = (Image)e.Row.FindControl("Image5"); 
     if (val < 0) 
     { 
      Image5.ImageUrl = "~/NewFolder1/warning_16x16.gif"; 
     } 
     else 
     { 
      Image5.ImageUrl = "~/NewFolder1/1258341827_tick.png"; 
     } 

     // alternately write the code above like this: 
     Image Image5 = (Image)e.Row.FindControl("Image5"); 
     Image5.ImageUrl = (val < 0) ? "~/NewFolder1/warning_16x16.gif" : "~/NewFolder1/1258341827_tick.png"; 
     // that's called the ternary operator. Takes up less space, does the same thing. 
    } 
} 

Пожалуйста, не игнорируйте эту часть

Теперь с другой стороны, ты в курсе, что вы можете связать в зад, как таким образом:

GridView1.RowDataBound += GridView1_RowDataBound; 

Поставил здесь:

for (int j = 0; j < 5; j++) 
    { 
     GridView Grid = new GridView(); 
     ArrayList machID = new ArrayList(); 
     ArrayList machName = new ArrayList(); 

     //NEW LINE (doesn't need the comment or the blank space tho) 
     Grid.RowDataBound += Grid_RowDataBound; 

     Grid.ID = machGrps[j].ToString(); 
     Grid.AllowSorting = true; 
     Grid.CellSpacing = 2; 
     Grid.GridLines = GridLines.None; 
     Grid.Width = Unit.Percentage(100); 
+0

e.Row.RowType == DataControlRowType.DataRow, как вы говорите, займет всю строку, но как мне изменить значение в этой строке. как я вижу, я заселил это динамически. Я имею в виду, что сначала у меня был ярлык, потому что он содержал идентификатор, но теперь у меня нет ярлыка nay, чтобы найти – user175084

+0

drachenstern .. вот что я говорю, что нет элемента управления Label 3, так как там я не создавал gridview в HTML-страницу, поэтому, когда она пытается это сделать "Label Label3 = (Label) e.Row.FindControl (" Label3 ");" он ничего не получит. – user175084

+1

@ user175084 ~ Ах, думаю, я вижу проблему. Знаете ли вы, какую ячейку вы хотите от стола?(вы можете найти это, например, с Firebug), тогда вы можете сделать 'e.Row.Cells [0] .Text' вместо' Label3.Text'. Я просто понял, что вы ищете ярлык, который вы никогда явно не назначали. Вы также можете использовать 'DataItem'' Row' из 'e.Row.DataItem', если вы хотите использовать значение из своего datatable. – jcolebrand

1

Разве это происходит, когда вы привязываете DataSource к объекту Session?

Grid.DataSource = taskTable; 
+0

выше код работает отлично ... но как мне изменить gridview, я получаю .... Я привел пример выше – user175084

2

ли динамические изменения на GridView1_RowDataBound не на GridView1_DataBound

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     Label Label3 = (Label)e.Row.FindControl("Label3"); 
     .... 
    } 
} 
+0

, ваши пальцы были быстрее, или так оно и появилось, но я думаю, что он не знает части синтаксиса, см. последнюю строку моего сообщения. .. – jcolebrand

+1

lol, я думаю, вы быстрее, просто набрали больше строк, чем я :) – Raymund

+0

Здравствуйте, могу я знать, где вы g и твой аватар? Я ищу сайты, которые предоставляют такие услуги. Где ты взял? – yonan2236

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